26 #ifndef TG_TAGGED_NAMED_LIST_H
27 #define TG_TAGGED_NAMED_LIST_H
44 assert(m_elements.empty());
55 assertUniqueElements(
"All elements must be unique.");
65 std::vector<T*>
find(std::string tags)
67 std::vector<T*> result;
68 for(
int i = 0; i < m_elements.size(); i++) {
69 if(_taggable(&m_elements[i])->hasAllTags(tags)) {
70 result.push_back(&(m_elements[i]));
78 return m_elements.size();
81 std::vector<T*> findAll()
83 std::vector<T*> result;
84 for(
int i = 0; i < m_elements.size(); i++) {
85 result.push_back(&(m_elements[i]));
90 std::vector<T*> findUntagged()
92 std::vector<T*> result;
93 for(
int i = 0; i < m_elements.size(); i++) {
96 result.push_back(&(m_elements[i]));
102 static bool contains(std::vector<T*> haystack,
const T* needle)
104 return std::find(haystack.begin(), haystack.end(), needle) != haystack.end();
107 bool contains(
const T& needle)
const
110 for(
typename std::vector<T>::const_iterator it = m_elements.begin(); it != m_elements.end(); it++) {
111 if(&(*it) == &needle)
124 assertKeyExists(key);
125 return m_elements[key];
129 assertKeyExists(key);
130 return m_elements[key];
140 assertNameExists(name);
163 this->addElement(other);
168 this->addElements(other);
176 int addElement(T element)
179 assert(!elementExists(element));
180 assertUnique(element);
183 int idx = m_elements.size();
184 m_elements.push_back(element);
188 int addElement(T element, std::string name)
190 assertNameUnused(name);
191 int idx = addElement(element);
196 void addElements(std::vector<T*> elements)
198 for(
int i = 0; i < elements.size(); i++) {
199 this->addElement(elements[i]);
203 void setElement(
int key, T element) {
204 assert((0 <= key) && (key <= m_elements.size()));
205 m_elements[key] = element;
208 std::vector<T>& getElements()
213 const std::vector<T>& getElements()
const
243 T& getElement(
int key)
245 return m_elements[key];
249 const T& getElement(
int key)
const
251 return m_elements[key];
255 T& getElement(std::string name)
257 assertNameExists(name);
258 return this[m_names[name]];
278 return (0 <= key) && (key < m_elements.size());
281 bool nameExists(std::string name)
const
283 return m_names.count(name) != 0;
287 bool elementExists(
const T& element)
const
290 for(
int i = 0; i < m_elements.size(); i++) {
292 const T* elem =& m_elements[i];
293 if (elem == &element) {
300 void assertKeyExists(
int key, std::string message =
"Element at index does not exist")
const
303 std::stringstream ss;
305 throw std::out_of_range(message +
" (index "+ ss.str() +
").");
309 void assertNameExists(std::string name, std::string message =
"Name pointer does not exist")
const
311 if(!nameExists(name)) {
312 std::stringstream ss;
314 throw std::out_of_range(message +
" (name '"+ ss.str() +
"').");
318 void assertNameUnused(std::string name, std::string message =
"Name already used")
const
320 if(nameExists(name)) {
321 std::stringstream ss;
323 throw std::logic_error(message +
" (name '"+ ss.str() +
"').");
327 void assertUnique(T& element, std::string message =
"Taggable elements must be unique.") {
328 if(elementExists(element)) {
329 throw std::logic_error(message);
333 void assertUniqueElements(std::string message =
"Taggable elements must be unique.")
const
339 if(! std::set<T>(m_elements.begin(), m_elements.end()).size() ==
341 throw std::logic_error(message);
353 std::vector<T> m_elements;
354 std::map<std::string, int> m_names;
std::vector< T * > find(std::string tags)
T & operator+=(const T &other)
Contains the definition of class tgTaggable.
T & operator[](const std::string &name)
tgTaggedNamedList(std::vector< T > &elements)
bool keyExists(int key) const
int setNameIndex(const std::string &name, int idx)