# eoState.h

    00001 // -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
    00002
    00003 //-----------------------------------------------------------------------------
    00004 // eoState.h
    00005 // (c) Marc Schoenauer, Maarten Keijzer and GeNeura Team, 2000
    00006 /*
    00007     This library is free software; you can redistribute it and/or
    00008     modify it under the terms of the GNU Lesser General Public
    00009     License as published by the Free Software Foundation; either
    00010     version 2 of the License, or (at your option) any later version.
    00011
    00012     This library is distributed in the hope that it will be useful,
    00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
    00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00015     Lesser General Public License for more details.
    00016
    00017     You should have received a copy of the GNU Lesser General Public
    00018     License along with this library; if not, write to the Free Software
    00019     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    00020
    00021     Contact: todos@geneura.ugr.es, http://geneura.ugr.es
    00022              Marc.Schoenauer@polytechnique.fr
    00023              mkeijzer@dhi.dk
    00024  */
    00025 //-----------------------------------------------------------------------------
    00026
    00027 #ifndef eoState_h
    00028 #define eoState_h
    00029
    00030 #include <stdexcept>
    00031 #include <string>
    00032 #include <map>
    00033 #include <vector>
    00034
    00035 #include <eoFunctorStore.h>
    00036
    00037 class eoObject;
    00038 class eoPersistent;
    00039
    00054 class eoState : public eoFunctorStore
    00055 {
    00056 public :
    00057
    00058     eoState(void) {}
    00059
    00060     ~eoState(void);
    00061
    00065     void registerObject(eoPersistent& registrant);
    00066
    00072     template <class T>
    00073     T&   takeOwnership(const T& persistent)
    00074     {
    00075         // If the compiler budges here, T is not a subclass of eoPersistent
    00076         ownedObjects.push_back(new T(persistent));
    00077         return static_cast<T&>(*ownedObjects.back());
    00078     }
    00079
    00083     struct loading_error : public std::runtime_error
    00084     {
    00085         loading_error(std::string huh = "Error while loading") : std::runtime_error(huh) {}
    00086     };
    00087
    00088     std::string getCommentString(void) const { return "#"; }
    00089
    00095     void load(const std::string& _filename);
    00096
    00102     void load(std::istream& is);
    00103
    00109     void save(const std::string& _filename) const;
    00110
    00116     void save(std::ostream& os) const;
    00117
    00118 private :
    00119     std::string createObjectName(eoObject* obj);
    00120
    00121     // first is Persistent, second is the raw data associated with it.
    00122     typedef std::map<std::string, eoPersistent*> ObjectMap;
    00123
    00124     ObjectMap objectMap;
    00125
    00126     std::vector<ObjectMap::iterator> creationOrder;
    00127     std::vector<eoPersistent*> ownedObjects;
    00128
    00129     // private copy and assignment as eoState is supposed to be unique
    00130     eoState(const eoState&);
    00131     eoState& operator=(const eoState&);
    00132
    00133 };
    00134
    00135 #endif