/** \file FormatParserStorage.hpp * * date: Jun, 22 2010 * author: heber * */ #ifndef FORMATPARSERSTORAGE_HPP_ #define FORMATPARSERSTORAGE_HPP_ // include config.h #ifdef HAVE_CONFIG_H #include #endif #include "CodePatterns/Singleton.hpp" #include #include #include #include "Parser/FormatParser.hpp" #include "Parser/MpqcParser.hpp" #include "Parser/PcpParser.hpp" #include "Parser/PdbParser.hpp" #include "Parser/TremoloParser.hpp" #include "Parser/XyzParser.hpp" class atom; // enum has to be outside of class for operator++ to be possible enum ParserTypes { mpqc, pcp, pdb, tremolo, xyz, ParserTypes_end, ParserTypes_begin = mpqc }; typedef enum ParserTypes ParserTypes; ParserTypes &operator++(ParserTypes &type); template enum ParserTypes getPType(); template <> enum ParserTypes getPType(); template <> enum ParserTypes getPType(); template <> enum ParserTypes getPType(); template <> enum ParserTypes getPType(); template <> enum ParserTypes getPType(); class FormatParserStorage : public Singleton { friend class Singleton; public: void addMpqc(); void addPcp(); void addPdb(); void addTremolo(); void addXyz(); bool add(std::string type); bool add(ParserTypes type); bool load(std::istream &input, std::string suffix); bool save(std::ostream &output, std::string suffix, const std::vector &atoms); bool saveSelectedAtoms(std::ostream &output, std::string suffix); bool saveSelectedMolecules(std::ostream &output, std::string suffix); bool saveWorld(std::ostream &output, std::string suffix); MpqcParser &getMpqc(); PcpParser &getPcp(); PdbParser &getPdb(); TremoloParser &getTremolo(); XyzParser &getXyz(); FormatParser &get(enum ParserTypes _type); ParserTypes getTypeFromName(std::string type); ParserTypes getTypeFromSuffix(std::string type); void SetOutputPrefixForAll(std::string &_prefix); void SaveAll(); private: // private constructors as this is a singleton FormatParserStorage(); ~FormatParserStorage(); // list of allocated parsers std::vector ParserList; // list of allocated strams std::vector ParserStream; // which parser is already present std::vector ParserPresent; // default suffix of each parser type std::map ParserSuffixes; std::map ParserLookupSuffixes; // function pointers to each add...() std::map< ParserTypes, void (FormatParserStorage::*)() > ParserAddFunction; // type name of each parser type and reverse lookup std::map ParserNames; std::map ParserLookupNames; // prefix of the filenames to use on save std::string prefix; public: template void addParser() { enum ParserTypes Ptype = getPType(); if (!ParserPresent[Ptype]) { ParserList[Ptype] = new ParserT(); ParserPresent[Ptype] = true; } else { ASSERT(ParserNames.find(Ptype) != ParserNames.end(), "FormatParserStorage::addParser() - ParserNames unknown for type"+toString((size_t)Ptype)+"."); ASSERT(ParserSuffixes.find(Ptype) != ParserSuffixes.end(), "FormatParserStorage::addParser() - ParserSuffixes unknown for type"+toString((size_t)Ptype)+"."); LOG(2, "INFO: Parser " << ParserNames[Ptype] << " is already present." << std::endl << "Note that you don't need to add '-o " << ParserSuffixes[Ptype] << "' if the input file is non-empty and of type " << ParserSuffixes[Ptype] << "." << std::endl); } } template ParserT &getParser() { enum ParserTypes Ptype = getPType(); if(!ParserPresent[Ptype]) addParser(); return dynamic_cast(*ParserList[Ptype]); } }; #endif // FORMATPARSERSTORAGE_HPP_