00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef NAMED_OBJECT_DATABASE_H_
00026 #define NAMED_OBJECT_DATABASE_H_
00027
00028 #include <Core/Container/HashMap.h>
00029 #include <Core/Container/Deque.h>
00030
00031 namespace Lamp{
00032
00033
00034
00035
00036
00037 template <typename Type>
00038 class NamedObjectDatabase{
00039 public:
00040
00041
00042
00043
00044
00045 NamedObjectDatabase(int capacity = 256, float loadFactor = 0.75f) :
00046 hash_(capacity, loadFactor), array_(capacity){
00047 }
00048
00049
00050
00051
00052 virtual ~NamedObjectDatabase(){
00053 Assert(hash_.getCount() == 0);
00054 Assert(array_.getCount() == 0);
00055 }
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 virtual bool add(const String& name, Type* object){
00066 Assert(name.getSize() != 0);
00067 Assert(object != NULL);
00068 if(search(name) != NULL){ return false; }
00069 hash_.put(name, object);
00070 array_.pushBack(object);
00071 return true;
00072 }
00073
00074
00075
00076
00077
00078
00079 virtual bool remove(const String& name, Type* object){
00080 Assert(name.getSize() != 0);
00081 Assert(object != NULL);
00082 Type* removeObject = search(name);
00083 if(removeObject == NULL){ return false; }
00084 if(removeObject != object){ return false; }
00085 if(array_.removeByValue(object) == -1){ return false; }
00086 if(hash_.remove(name) == NULL){ Assert(false); }
00087 return true;
00088 }
00089
00090
00091
00092
00093
00094 virtual int clear(){
00095 int result = getCount();
00096 array_.clear();
00097 hash_.clear();
00098 return result;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107
00108 virtual int getCount(){ return array_.getCount(); }
00109
00110
00111
00112
00113
00114
00115 virtual Type* get(int index){ return array_.get(index); }
00116
00117
00118
00119
00120
00121
00122 virtual Type* search(const String& name){ return hash_.get(name); }
00123
00124 private:
00125
00126
00127 NamedObjectDatabase(const NamedObjectDatabase& copy);
00128
00129
00130 void operator =(const NamedObjectDatabase& copy);
00131
00132
00133 HashMap<String, Type*> hash_;
00134
00135 Deque<Type*> array_;
00136
00137 };
00138
00139
00140 }
00141 #endif // End of NAMED_OBJECT_DATABASE_H_
00142