00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "dcKeywordList.h"
00016 #include "dcKeyword.h"
00017 #include "hashGenerator.h"
00018
00019
00020
00021
00022
00023
00024 DCKeywordList::
00025 DCKeywordList() :
00026 _flags(0)
00027 {
00028 }
00029
00030
00031
00032
00033
00034
00035 DCKeywordList::
00036 DCKeywordList(const DCKeywordList ©) :
00037 _keywords(copy._keywords),
00038 _keywords_by_name(copy._keywords_by_name),
00039 _flags(copy._flags)
00040 {
00041 }
00042
00043
00044
00045
00046
00047
00048 void DCKeywordList::
00049 operator = (const DCKeywordList ©) {
00050 _keywords = copy._keywords;
00051 _keywords_by_name = copy._keywords_by_name;
00052 _flags = copy._flags;
00053 }
00054
00055
00056
00057
00058
00059
00060 DCKeywordList::
00061 ~DCKeywordList() {
00062 nassertv(_keywords_by_name.size() == _keywords.size());
00063 }
00064
00065
00066
00067
00068
00069
00070
00071 bool DCKeywordList::
00072 has_keyword(const string &name) const {
00073 return (_keywords_by_name.find(name) != _keywords_by_name.end());
00074 }
00075
00076
00077
00078
00079
00080
00081
00082 bool DCKeywordList::
00083 has_keyword(const DCKeyword *keyword) const {
00084 return has_keyword(keyword->get_name());
00085 }
00086
00087
00088
00089
00090
00091
00092 int DCKeywordList::
00093 get_num_keywords() const {
00094 nassertr(_keywords_by_name.size() == _keywords.size(), 0);
00095 return _keywords.size();
00096 }
00097
00098
00099
00100
00101
00102
00103 const DCKeyword *DCKeywordList::
00104 get_keyword(int n) const {
00105 nassertr(n >= 0 && n < (int)_keywords.size(), NULL);
00106 return _keywords[n];
00107 }
00108
00109
00110
00111
00112
00113
00114
00115
00116 const DCKeyword *DCKeywordList::
00117 get_keyword_by_name(const string &name) const {
00118 KeywordsByName::const_iterator ni;
00119 ni = _keywords_by_name.find(name);
00120 if (ni != _keywords_by_name.end()) {
00121 return (*ni).second;
00122 }
00123
00124 return NULL;
00125 }
00126
00127
00128
00129
00130
00131
00132
00133
00134 bool DCKeywordList::
00135 compare_keywords(const DCKeywordList &other) const {
00136 return _keywords_by_name == other._keywords_by_name;
00137 }
00138
00139
00140
00141
00142
00143
00144
00145 void DCKeywordList::
00146 copy_keywords(const DCKeywordList &other) {
00147 (*this) = other;
00148 }
00149
00150
00151
00152
00153
00154
00155
00156 bool DCKeywordList::
00157 add_keyword(const DCKeyword *keyword) {
00158 bool inserted = _keywords_by_name.insert(KeywordsByName::value_type(keyword->get_name(), keyword)).second;
00159 if (inserted) {
00160 _keywords.push_back(keyword);
00161 _flags |= keyword->get_historical_flag();
00162 }
00163
00164 return inserted;
00165 }
00166
00167
00168
00169
00170
00171
00172 void DCKeywordList::
00173 clear_keywords() {
00174 _keywords.clear();
00175 _keywords_by_name.clear();
00176 _flags = 0;
00177 }
00178
00179
00180
00181
00182
00183
00184 void DCKeywordList::
00185 output_keywords(ostream &out) const {
00186 Keywords::const_iterator ki;
00187 for (ki = _keywords.begin(); ki != _keywords.end(); ++ki) {
00188 out << " " << (*ki)->get_name();
00189 }
00190 }
00191
00192
00193
00194
00195
00196
00197
00198 void DCKeywordList::
00199 generate_hash(HashGenerator &hashgen) const {
00200 if (_flags != ~0) {
00201
00202
00203
00204 hashgen.add_int(_flags);
00205
00206 } else {
00207
00208
00209
00210 hashgen.add_int(_keywords_by_name.size());
00211 KeywordsByName::const_iterator ni;
00212 for (ni = _keywords_by_name.begin(); ni != _keywords_by_name.end(); ++ni) {
00213 (*ni).second->generate_hash(hashgen);
00214 }
00215 }
00216 }