Panda3D

Loading...
Searching...
No Matches
dcKeywordList.cxx
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file dcKeywordList.cxx
10 * @author drose
11 * @date 2005-07-25
12 */
13
14#include "dcKeywordList.h"
15#include "dcKeyword.h"
16#include "hashGenerator.h"
17
18/**
19 *
20 */
21DCKeywordList::
22DCKeywordList() :
23 _flags(0)
24{
25}
26
27/**
28 *
29 */
30DCKeywordList::
31DCKeywordList(const DCKeywordList &copy) :
32 _keywords(copy._keywords),
33 _keywords_by_name(copy._keywords_by_name),
34 _flags(copy._flags)
35{
36}
37
38/**
39 *
40 */
41 void DCKeywordList::
42operator = (const DCKeywordList &copy) {
43 _keywords = copy._keywords;
44 _keywords_by_name = copy._keywords_by_name;
45 _flags = copy._flags;
46}
47
48/**
49 *
50 */
51DCKeywordList::
52~DCKeywordList() {
53 nassertv(_keywords_by_name.size() == _keywords.size());
54}
55
56/**
57 * Returns true if this list includes the indicated keyword, false otherwise.
58 */
59 bool DCKeywordList::
60 has_keyword(const std::string &name) const {
61 return (_keywords_by_name.find(name) != _keywords_by_name.end());
62}
63
64/**
65 * Returns true if this list includes the indicated keyword, false otherwise.
66 */
67 bool DCKeywordList::
68 has_keyword(const DCKeyword *keyword) const {
69 return has_keyword(keyword->get_name());
70}
71
72/**
73 * Returns the number of keywords in the list.
74 */
75 int DCKeywordList::
76 get_num_keywords() const {
77 nassertr(_keywords_by_name.size() == _keywords.size(), 0);
78 return _keywords.size();
79}
80
81/**
82 * Returns the nth keyword in the list.
83 */
84 const DCKeyword *DCKeywordList::
85 get_keyword(int n) const {
86 nassertr(n >= 0 && n < (int)_keywords.size(), nullptr);
87 return _keywords[n];
88}
89
90/**
91 * Returns the keyword in the list with the indicated name, or NULL if there
92 * is no keyword in the list with that name.
93 */
94 const DCKeyword *DCKeywordList::
95 get_keyword_by_name(const std::string &name) const {
96 KeywordsByName::const_iterator ni;
97 ni = _keywords_by_name.find(name);
98 if (ni != _keywords_by_name.end()) {
99 return (*ni).second;
100 }
101
102 return nullptr;
103}
104
105/**
106 * Returns true if this list has the same keywords as the other list, false if
107 * some keywords differ. Order is not considered important.
108 */
109 bool DCKeywordList::
110 compare_keywords(const DCKeywordList &other) const {
111 return _keywords_by_name == other._keywords_by_name;
112}
113
114/**
115 * Replaces this keyword list with those from the other list.
116 */
117 void DCKeywordList::
118 copy_keywords(const DCKeywordList &other) {
119 (*this) = other;
120}
121
122/**
123 * Adds the indicated keyword to the list. Returns true if it is added, false
124 * if it was already there.
125 */
126 bool DCKeywordList::
127 add_keyword(const DCKeyword *keyword) {
128 bool inserted = _keywords_by_name.insert(KeywordsByName::value_type(keyword->get_name(), keyword)).second;
129 if (inserted) {
130 _keywords.push_back(keyword);
131 _flags |= keyword->get_historical_flag();
132 }
133
134 return inserted;
135}
136
137/**
138 * Removes all keywords from the field.
139 */
140 void DCKeywordList::
141 clear_keywords() {
142 _keywords.clear();
143 _keywords_by_name.clear();
144 _flags = 0;
145}
146
147/**
148 *
149 */
150 void DCKeywordList::
151output_keywords(std::ostream &out) const {
152 Keywords::const_iterator ki;
153 for (ki = _keywords.begin(); ki != _keywords.end(); ++ki) {
154 out << " " << (*ki)->get_name();
155 }
156}
157
158/**
159 * Accumulates the properties of these keywords into the hash.
160 */
161 void DCKeywordList::
162 generate_hash(HashGenerator &hashgen) const {
163 if (_flags != ~0) {
164 // All of the flags are historical flags only, so add just the flags
165 // bitmask to keep the hash code the same as it has historically been.
166 hashgen.add_int(_flags);
167
168 } else {
169 // There is at least one custom flag, so go ahead and make the hash code
170 // reflect it.
171
172 hashgen.add_int(_keywords_by_name.size());
173 KeywordsByName::const_iterator ni;
174 for (ni = _keywords_by_name.begin(); ni != _keywords_by_name.end(); ++ni) {
175 (*ni).second->generate_hash(hashgen);
176 }
177 }
178}
DCKeywordList
This is a list of keywords (see DCKeyword) that may be set on a particular field.
Definition dcKeywordList.h:26
DCKeywordList::copy_keywords
void copy_keywords(const DCKeywordList &other)
Replaces this keyword list with those from the other list.
Definition dcKeywordList.cxx:118
DCKeywordList::clear_keywords
void clear_keywords()
Removes all keywords from the field.
Definition dcKeywordList.cxx:141
DCKeywordList::add_keyword
bool add_keyword(const DCKeyword *keyword)
Adds the indicated keyword to the list.
Definition dcKeywordList.cxx:127
DCKeywordList::get_keyword
const DCKeyword * get_keyword(int n) const
Returns the nth keyword in the list.
Definition dcKeywordList.cxx:85
DCKeywordList::generate_hash
void generate_hash(HashGenerator &hashgen) const
Accumulates the properties of these keywords into the hash.
Definition dcKeywordList.cxx:162
DCKeywordList::compare_keywords
bool compare_keywords(const DCKeywordList &other) const
Returns true if this list has the same keywords as the other list, false if some keywords differ.
Definition dcKeywordList.cxx:110
DCKeywordList::has_keyword
bool has_keyword(const std::string &name) const
Returns true if this list includes the indicated keyword, false otherwise.
Definition dcKeywordList.cxx:60
DCKeywordList::get_keyword_by_name
const DCKeyword * get_keyword_by_name(const std::string &name) const
Returns the keyword in the list with the indicated name, or NULL if there is no keyword in the list w...
Definition dcKeywordList.cxx:95
DCKeywordList::get_num_keywords
int get_num_keywords() const
Returns the number of keywords in the list.
Definition dcKeywordList.cxx:76
DCKeyword
This represents a single keyword declaration in the dc file.
Definition dcKeyword.h:28
DCKeyword::get_name
const std::string & get_name() const
Returns the name of this keyword.
Definition dcKeyword.cxx:39
DCKeyword::get_historical_flag
int get_historical_flag() const
Returns the bitmask associated with this keyword, if any.
Definition dcKeyword.cxx:50
HashGenerator
This class generates an arbitrary hash number from a sequence of ints.
Definition hashGenerator.h:23
HashGenerator::add_int
void add_int(int num)
Adds another integer to the hash so far.
Definition hashGenerator.cxx:41
dcKeywordList.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
dcKeyword.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
hashGenerator.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.