Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   Related Pages  

entity_complements.h

Go to the documentation of this file.
00001 /* -*- c++ -*- */
00002 #ifndef AKAXISO2_FRAMEWORK_ENTITY_COMPLEMENTS_H__
00003 #define AKAXISO2_FRAMEWORK_ENTITY_COMPLEMENTS_H__
00004 
00010 #include <akaxiso2/framework/types.h>
00011 #include <akaxiso2/util/shared_ptr.h>
00012 #include <map>
00013 #include <set>
00014 
00015 namespace aka2 {
00016   class prefix_map;
00017 
00018   void reset_for_new_document();
00019 
00024   struct complement_operator {
00025     virtual ~complement_operator() { }
00030     virtual void reset_for_new_document(void *e) const = 0;
00031   };
00032 
00036   template <class T>
00037   struct T_complement_operator : public complement_operator {
00038     virtual void reset_for_new_document(void *e) const {
00039       T* t = static_cast<T*>(e);
00040       t->clear();
00041     }
00042   };
00043 
00049   struct entity_complement {
00055     entity_complement(void *complement, complement_operator *op)
00056       : complement_(complement), op_(op) { }
00057     void *complement_;
00058     shared_ptr<complement_operator> op_;
00059     
00063     void reset_for_new_document() const {
00064       op_->reset_for_new_document(complement_);
00065     }
00066   };
00067 
00068 
00069   typedef std::set<std::string> id_constraint;
00070 
00082   class entity_complements {
00083     shared_ptr<prefix_map> prefixes_;
00084     typedef std::map<std::string, entity_complement> complements;
00085     complements complements_;
00086     entity_complements(const entity_complements &); // hidden copy-ctor.
00087     id_constraint id_constraint_;
00088     void clear_complements();
00089   public:
00094     prefix_map &get_prefixes() const { return *prefixes_; }
00095 
00101     template<class T>
00102     void add_complement(const std::string &name, T &t) {
00103       add_complement(name, &t, new T_complement_operator<T>());
00104     }
00105 
00112     template<class T>
00113     void add_complement(const std::string &name, T &t, complement_operator *op) {
00114       add_complement_ptr(name, &t, op);
00115     }
00116 
00117     void add_complement_ptr(const std::string &name, void *p, complement_operator *prop_op);
00118     void *get_complement_ptr(const std::string &name) const;
00119     const void *const_get_complement_ptr(const std::string &name) const;
00120 
00127     bool check_id(const std::string &value);
00128 
00132     void clear_all();
00133 
00137     void reset_for_new_document();
00138 
00139     shared_ptr<entity_complements> clone(bool copy_prefixes) const;
00140     explicit entity_complements();
00141     ~entity_complements();
00142   };
00143 
00144 
00151   template<class T>
00152   inline T& get_complement(entity_complements &ecomps, const std::string &name) {
00153     return *static_cast<T*>(ecomps.get_complement_ptr(name));
00154   }
00155   
00162   template<class T>
00163   inline const T& get_complement(const entity_complements &ecomps, 
00164                                  const std::string &name) {
00165     return *static_cast<const T*>(ecomps.const_get_complement_ptr(name));
00166   }
00167 }
00168 
00169 #endif

Generated on Sat Dec 18 22:43:28 2004 for akaxiso2 by doxygen1.2.18