00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #include "config.h"
00020 
00021 #include "EDoc/ManagedObject.h"
00022 
00023 #include "EDoc/Type.h"
00024 #include "EDoc/Function.h"
00025 #include "EDoc/FunctionType.h"
00026 #include "EDoc/File.h"
00027 #include "EDoc/PStack.h"
00028 #include "EDoc/StackRef.h"
00029 #include "EDoc/utils.h"
00030 
00031 namespace EDoc
00032 {
00033 
00034    
00035    void AllocNew(File*& obj,           Dictionary& dict, std::string key_name)
00036    {
00037       EDOC_ASSERT(&dict != NULL, "");
00038       EDOC_Finer("Creating new file object with key name: " << key_name);
00039       obj = new File(dict, key_name);
00040    }
00041    
00042    void AllocNew(Type*& obj,           Dictionary& dict, std::string key_name)
00043    {
00044       EDOC_ASSERT(&dict != NULL, "");
00045       obj = new Type(dict, key_name);
00046    }
00047    
00048    void AllocNew(Function*& obj,       Dictionary& dict, std::string key_name)
00049    {
00050       EDOC_ASSERT(&dict != NULL, "");
00051       obj = new Function(dict, key_name);
00052    }
00053    
00054    void AllocNew(FunctionType*& obj,   Dictionary& dict, std::string key_name)
00055    {
00056       EDOC_ASSERT(&dict != NULL, "");
00057       obj = new FunctionType(dict, key_name);
00058    }
00059    
00060 
00061    void AllocNew(File*& obj,           Dictionary& dict, uint32_t index)
00062    {
00063       EDOC_ASSERT(&dict != NULL, "");
00064       EDOC_Finer("Creating new file object with index: " << index);
00065       obj = new File(dict, index);
00066    }
00067    
00068    void AllocNew(Type*& obj,           Dictionary& dict, uint32_t index)
00069    {
00070       EDOC_ASSERT(&dict != NULL, "");
00071       obj = new Type(dict, index);
00072    }
00073    
00074    void AllocNew(Function*& obj,       Dictionary& dict, uint32_t index)
00075    {
00076       EDOC_ASSERT(&dict != NULL, "");
00077       obj = new Function(dict, index);
00078    }
00079    
00080    void AllocNew(FunctionType*& obj,   Dictionary& dict, uint32_t index)
00081    {
00082       EDOC_ASSERT(&dict != NULL, "");
00083       obj = new FunctionType(dict, index);
00084    }
00085    
00086 
00087 
00088    
00089    ManagedObject::ManagedObject(Dictionary& dict_in) :
00090       DictionarySpecific(&dict_in)
00091    {
00092       EDOC_ASSERT(&dict != NULL, "");
00093    }
00094    
00095    void ManagedObject::EraseAll()
00096    {
00097       EDOC_FOREACH(StrIDObjPMap, it, items)
00098       {
00099          delete it->second;
00100          it->second = NULL;
00101       }
00102       Erase(items);
00103    }
00104    
00105    size_t ManagedObject::ReplaceReferences(PStack& stack, void* remove, 
00106       void* replace)
00107    {
00108       size_t count = 0;
00109       EDOC_FOREACH(StrIDObjPMap, it, items)
00110       {
00111          count += it->second->ReplaceReferences(stack, remove, replace);
00112       }
00113 
00114       return count;
00115    }
00116    
00117    void ManagedObject::Validate(PStack& stack, const Dictionary& dict_in) const
00118    {
00119       EDOC_ASSERT(&dict == &dict_in, 
00120          "Current dict: " << &dict 
00121          << "\nRequired dict: " << &dict_in);
00122 
00123       EDOC_FOREACH_CONST(StrIDObjPMap, it, items)
00124       {
00125          EDOC_Finer("Validating: " << it->first);
00126          EDOC_ASSERT(it->first == it->second->GetKeyName(), 
00127             "All items should be indexed by their key names."
00128             << " Index: " << it->first 
00129             << ", Key Name: " << it->second->GetKeyName());
00130          it->second->Validate(stack, dict_in);
00131       }
00132    }
00133    
00134    std::ostream& ManagedObject::Print(std::ostream& out, 
00135       std::string prefix) const
00136    {
00137       EDOC_FOREACH_CONST(StrIDObjPMap, it, items)
00138       {
00139          it->second->Print(out, prefix) << std::endl;
00140       }
00141 
00142       return out;
00143    }
00144    
00145    ManagedObject& ManagedObject::operator=(
00146       const ManagedObject& EDOC_UNUSED(right))
00147    {
00148       EDOC_ASSERT(false, "Assignment of managed objects should never occur "
00149          "but is required by SWIG wrappers.");
00150       return *this;
00151    }
00152    
00153    StringIdentifiedObjectPtr ManagedObject::CAlwaysGet(std::string name)
00154    {
00155       StringIdentifiedObjectPtr item = CGet(name);
00156       if (!item)
00157       {
00158          item = New(dict, name);
00159          items.insert(std::pair<std::string, 
00160             StringIdentifiedObjectPtr>(name, item));
00161       }
00162       return item;
00163    }
00164    
00165    StringIdentifiedObjectPtr ManagedObject::CAlwaysGet(
00166       const StringIdentifiedObject& right)
00167    {
00168       if (&right.dict == &dict)
00169       {
00170          
00171          return const_cast<StringIdentifiedObjectPtr>(&right);
00172       }
00173       else
00174       {
00175          return CAlwaysGet(right.GetKeyName());
00176       }
00177    }
00178    
00179    void ManagedObject::CRemove(StringIdentifiedObjectPtr right)
00180    {
00181       
00182       
00183       
00184       EDOC_ASSERT(items.count(right->GetKeyName()), "");
00185       EDOC_ASSERT(items.find(right->GetKeyName())->second == right, "");
00186       items.erase(items.find(right->GetKeyName()));
00187    }
00188    
00189    void ManagedObject::CAdd(StringIdentifiedObjectPtr right)
00190    {
00191       EDOC_ASSERT(!items.count(right->GetKeyName()), "");
00192       items.insert(std::pair<std::string, StringIdentifiedObjectPtr>(
00193          right->GetKeyName(), right));
00194    }
00195    
00196 
00197 }