-/*\r
- * Copyright 2001-2006 Internet2\r
- * \r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-/**\r
- * @file XMLObjectChildrenList.h\r
- * \r
- * STL-compatible container wrapper\r
- */\r
-\r
-#if !defined(__xmltooling_list_h__)\r
-#define __xmltooling_list_h__\r
-\r
-#include <xmltooling/DOMCachingXMLObject.h>\r
-#include <xmltooling/exceptions.h>\r
-\r
-#define ListOf(type) xmltooling::XMLObjectChildrenList<type>\r
-\r
-namespace xmltooling {\r
-\r
- // Forward reference\r
- template <class _Tx, class _Ty=XMLObject> class XMLObjectChildrenList;\r
-\r
- /**\r
- * STL iterator that mediates access to an iterator over typed XML children.\r
- * @param _Ty a bidrectional sequence of the subtype to iterate over\r
- */\r
- template <class _Ty>\r
- class XMLObjectChildrenIterator\r
- {\r
- typename _Ty::iterator m_iter;\r
- template <class _Tx, class _Ty> friend class XMLObjectChildrenList;\r
- public:\r
- typedef typename _Ty::iterator::iterator_category iterator_category;\r
- typedef typename _Ty::iterator::value_type value_type;\r
- typedef typename _Ty::iterator::reference reference;\r
- typedef typename _Ty::iterator::pointer pointer;\r
- typedef typename _Ty::const_iterator::reference const_reference;\r
- typedef typename _Ty::const_iterator::pointer const_pointer;\r
- typedef typename _Ty::iterator::difference_type difference_type;\r
-\r
- XMLObjectChildrenIterator() {\r
- }\r
-\r
- XMLObjectChildrenIterator(typename _Ty::iterator& iter) {\r
- m_iter=iter;\r
- }\r
-\r
- const_reference operator*() const {\r
- return *m_iter;\r
- }\r
-\r
- pointer operator->() const {\r
- return (&**this);\r
- }\r
-\r
- XMLObjectChildrenIterator& operator++() {\r
- // preincrement\r
- ++m_iter;\r
- return (*this);\r
- }\r
-\r
- XMLObjectChildrenIterator& operator--() {\r
- // predecrement\r
- --m_iter;\r
- return (*this);\r
- }\r
-\r
- XMLObjectChildrenIterator operator++(int) {\r
- // postincrement\r
- XMLObjectChildrenIterator _Tmp = *this;\r
- ++*this;\r
- return (_Tmp);\r
- }\r
-\r
- XMLObjectChildrenIterator operator--(int) {\r
- // postdecrement\r
- XMLObjectChildrenIterator _Tmp = *this;\r
- --*this;\r
- return (_Tmp);\r
- }\r
-\r
- XMLObjectChildrenIterator& operator+=(difference_type _Off) {\r
- // increment by integer\r
- m_iter += _Off;\r
- return (*this);\r
- }\r
-\r
- XMLObjectChildrenIterator operator+(difference_type _Off) const {\r
- // return this + integer\r
- XMLObjectChildrenIterator _Tmp = *this;\r
- return (_Tmp += _Off);\r
- }\r
-\r
- XMLObjectChildrenIterator& operator-=(difference_type _Off) {\r
- // decrement by integer\r
- return (*this += -_Off);\r
- }\r
-\r
- XMLObjectChildrenIterator operator-(difference_type _Off) const {\r
- // return this - integer\r
- XMLObjectChildrenIterator _Tmp = *this;\r
- return (_Tmp -= _Off);\r
- }\r
-\r
- difference_type operator-(const XMLObjectChildrenIterator& _Right) const {\r
- // return difference of iterators\r
- return m_iter - _Right.m_iter);\r
- }\r
-\r
- const_reference operator[](difference_type _Off) const {\r
- // subscript\r
- return (*(*this + _Off));\r
- }\r
-\r
- bool operator==(const XMLObjectChildrenIterator &_Right) const {\r
- // test for iterator equality\r
- return (m_iter == _Right.m_iter);\r
- }\r
-\r
- bool operator!=(const XMLObjectChildrenIterator &_Right) const {\r
- // test for iterator inequality\r
- return (!(m_iter == _Right.m_iter));\r
- }\r
- };\r
-\r
- /**\r
- * STL-compatible container that mediates access to underlying lists of typed XML children.\r
- * @param _Tx the subtype to expose a container over\r
- * @param _Ty the base type in the underlying list (defaults to XMLObject)\r
- */\r
- template <class _Tx, class _Ty>\r
- class XMLObjectChildrenList\r
- {\r
- typedef typename std::vector<_Tx*> container;\r
- typename container& m_vector;\r
- typename std::list<_Ty*>& m_list;\r
- typename std::list<_Ty*>::iterator m_fence;\r
- XMLObject* m_parent;\r
-\r
- public:\r
- typedef typename container::value_type value_type;\r
- typedef typename container::reference reference;\r
- typedef typename container::const_reference const_reference;\r
- typedef typename container::difference_type difference_type;\r
- typedef typename container::size_type size_type;\r
-\r
- // We override the iterator types with our constrained wrapper.\r
- typedef XMLObjectChildrenIterator<typename container> iterator;\r
- typedef const XMLObjectChildrenIterator<typename container> const_iterator;\r
-\r
- /**\r
- * Constructor to expose a typed collection of children backed by a list of a base type.\r
- *\r
- * @param parent parent object of the collection\r
- * @param v underlying vector of iterators that reference the children\r
- * @param backing backing list for children\r
- * @param ins_fence a marker designating where new children of this type should be added\r
- */\r
- XMLObjectChildrenList(\r
- XMLObject* parent,\r
- typename container& v,\r
- typename std::list<_Ty*>& backing,\r
- typename std::list<_Ty*>::iterator ins_fence\r
- ) : m_parent(parent), m_vector(v), m_list(backing), m_fence(ins_fence) {\r
- }\r
-\r
- size_type size() const {\r
- // return length of sequence\r
- return m_vector.size();\r
- }\r
-\r
- bool empty() const {\r
- // test if sequence is empty\r
- return m_vector.empty();\r
- }\r
-\r
- iterator begin() {\r
- // return iterator for beginning of mutable sequence\r
- return m_vector.begin();\r
- }\r
-\r
- iterator end() {\r
- // return iterator for end of mutable sequence\r
- return m_vector.end();\r
- }\r
-\r
- const_iterator begin() const {\r
- // return iterator for beginning of const sequence\r
- return m_vector.begin();\r
- }\r
-\r
- const_iterator end() const {\r
- // return iterator for end of const sequence\r
- return m_vector.end();\r
- }\r
-\r
- const_reference at(size_type _Pos) const {\r
- // subscript nonmutable sequence with checking\r
- return m_vector.at(_Pos);\r
- }\r
-\r
- const_reference operator[](size_type _Pos) const {\r
- // subscript nonmutable sequence\r
- return m_vector[_Pos];\r
- }\r
-\r
- const_reference front() const {\r
- // return first element of nonmutable sequence\r
- return (*begin());\r
- }\r
-\r
- const_reference back() const {\r
- // return last element of nonmutable sequence\r
- return *(m_vector.back());\r
- }\r
-\r
- void push_back(const_reference _Val) {\r
- setParent(_Val);\r
- m_list.insert(m_fence,_Val);\r
- m_vector.push_back(_Val);\r
- }\r
-\r
- iterator erase(iterator _Where) {\r
- removeParent(*_Where);\r
- removeChild(*_Where);\r
- return m_vector.erase(_Where.m_iter);\r
- }\r
-\r
- iterator erase(iterator _First, iterator _Last) {\r
- for (iterator i=_First; i!=_Last; i++) {\r
- removeParent(*i);\r
- removeChild(*i);\r
- }\r
- return m_vector.erase(_First,_Last);\r
- }\r
-\r
- private:\r
- void setParent(const_reference _Val) {\r
- if (_Val->getParent())\r
- throw XMLObjectException("Child object already has a parent.");\r
- _Val->setParent(m_parent);\r
- DOMCachingXMLObject* dc=dynamic_cast<DOMCachingXMLObject*>(_Val);\r
- if (dc) {\r
- dc->releaseParentDOM(true);\r
- }\r
- }\r
-\r
- void removeParent(const_reference _Val) {\r
- if (_Val->getParent()!=m_parent)\r
- throw XMLObjectException("Child object not owned by this parent.");\r
- _Val->setParent(NULL);\r
- DOMCachingXMLObject* dc=dynamic_cast<DOMCachingXMLObject*>(m_parent);\r
- if (dc) {\r
- dc->releaseParentDOM(true);\r
- }\r
- }\r
-\r
- void removeChild(const_reference _Val) {\r
- for (typename std::list<_Ty*>::iterator i=m_list.begin(); i!=m_list.end(); i++) {\r
- if ((*i)==_Val) {\r
- m_list.erase(i);\r
- delete _Val;\r
- return;\r
- }\r
- }\r
- }\r
- };\r
-\r
-};\r
-\r
-#endif /* __xmltooling_list_h__ */\r
+/*
+ * Copyright 2001-2006 Internet2
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file XMLObjectChildrenList.h
+ *
+ * STL-compatible container wrapper
+ */
+
+#if !defined(__xmltooling_list_h__)
+#define __xmltooling_list_h__
+
+#include <xmltooling/DOMCachingXMLObject.h>
+#include <xmltooling/exceptions.h>
+
+#define ListOf(type) xmltooling::XMLObjectChildrenList<type>
+
+namespace xmltooling {
+
+ // Forward reference
+ template <class _Tx, class _Ty=XMLObject> class XMLObjectChildrenList;
+
+ /**
+ * STL iterator that mediates access to an iterator over typed XML children.
+ * @param _Ty a bidrectional sequence of the subtype to iterate over
+ */
+ template <class _Ty>
+ class XMLObjectChildrenIterator
+ {
+ typename _Ty::iterator m_iter;
+ template <class _Tx, class _Tz> friend class XMLObjectChildrenList;
+ public:
+ typedef typename _Ty::iterator::iterator_category iterator_category;
+ typedef typename _Ty::iterator::value_type value_type;
+ typedef typename _Ty::iterator::reference reference;
+ typedef typename _Ty::iterator::pointer pointer;
+ typedef typename _Ty::const_iterator::reference const_reference;
+ typedef typename _Ty::const_iterator::pointer const_pointer;
+ typedef typename _Ty::iterator::difference_type difference_type;
+
+ XMLObjectChildrenIterator() {
+ }
+
+ XMLObjectChildrenIterator(typename _Ty::iterator iter) {
+ m_iter=iter;
+ }
+
+ const_reference operator*() const {
+ return *m_iter;
+ }
+
+ pointer operator->() const {
+ return (&**this);
+ }
+
+ XMLObjectChildrenIterator& operator++() {
+ // preincrement
+ ++m_iter;
+ return (*this);
+ }
+
+ XMLObjectChildrenIterator& operator--() {
+ // predecrement
+ --m_iter;
+ return (*this);
+ }
+
+ XMLObjectChildrenIterator operator++(int) {
+ // postincrement
+ XMLObjectChildrenIterator _Tmp = *this;
+ ++*this;
+ return (_Tmp);
+ }
+
+ XMLObjectChildrenIterator operator--(int) {
+ // postdecrement
+ XMLObjectChildrenIterator _Tmp = *this;
+ --*this;
+ return (_Tmp);
+ }
+
+ XMLObjectChildrenIterator& operator+=(difference_type _Off) {
+ // increment by integer
+ m_iter += _Off;
+ return (*this);
+ }
+
+ XMLObjectChildrenIterator operator+(difference_type _Off) const {
+ // return this + integer
+ XMLObjectChildrenIterator _Tmp = *this;
+ return (_Tmp += _Off);
+ }
+
+ XMLObjectChildrenIterator& operator-=(difference_type _Off) {
+ // decrement by integer
+ return (*this += -_Off);
+ }
+
+ XMLObjectChildrenIterator operator-(difference_type _Off) const {
+ // return this - integer
+ XMLObjectChildrenIterator _Tmp = *this;
+ return (_Tmp -= _Off);
+ }
+
+ difference_type operator-(const XMLObjectChildrenIterator& _Right) const {
+ // return difference of iterators
+ return m_iter - _Right.m_iter;
+ }
+
+ const_reference operator[](difference_type _Off) const {
+ // subscript
+ return (*(*this + _Off));
+ }
+
+ bool operator==(const XMLObjectChildrenIterator &_Right) const {
+ // test for iterator equality
+ return (m_iter == _Right.m_iter);
+ }
+
+ bool operator!=(const XMLObjectChildrenIterator &_Right) const {
+ // test for iterator inequality
+ return (!(m_iter == _Right.m_iter));
+ }
+ };
+
+ /**
+ * STL-compatible container that mediates access to underlying lists of typed XML children.
+ * @param _Tx the subtype to expose a container over
+ * @param _Ty the base type in the underlying list (defaults to XMLObject)
+ */
+ template <class _Tx, class _Ty>
+ class XMLObjectChildrenList
+ {
+ typedef typename std::vector<_Tx*> container;
+ typename XMLObjectChildrenList::container& m_vector;
+ typename std::list<_Ty*>& m_list;
+ typename std::list<_Ty*>::iterator m_fence;
+ XMLObject* m_parent;
+
+ public:
+ typedef typename container::value_type value_type;
+ typedef typename container::reference reference;
+ typedef typename container::const_reference const_reference;
+ typedef typename container::difference_type difference_type;
+ typedef typename container::size_type size_type;
+
+ // We override the iterator types with our constrained wrapper.
+ typedef XMLObjectChildrenIterator<typename XMLObjectChildrenList::container> iterator;
+ typedef const XMLObjectChildrenIterator<typename XMLObjectChildrenList::container> const_iterator;
+
+ /**
+ * Constructor to expose a typed collection of children backed by a list of a base type.
+ *
+ * @param parent parent object of the collection
+ * @param v underlying vector of iterators that reference the children
+ * @param backing backing list for children
+ * @param ins_fence a marker designating where new children of this type should be added
+ */
+ XMLObjectChildrenList(
+ XMLObject* parent,
+ typename XMLObjectChildrenList::container& v,
+ typename std::list<_Ty*>& backing,
+ typename std::list<_Ty*>::iterator ins_fence
+ ) : m_parent(parent), m_vector(v), m_list(backing), m_fence(ins_fence) {
+ }
+
+ size_type size() const {
+ // return length of sequence
+ return m_vector.size();
+ }
+
+ bool empty() const {
+ // test if sequence is empty
+ return m_vector.empty();
+ }
+
+ iterator begin() {
+ // return iterator for beginning of mutable sequence
+ return m_vector.begin();
+ }
+
+ iterator end() {
+ // return iterator for end of mutable sequence
+ return m_vector.end();
+ }
+
+ const_iterator begin() const {
+ // return iterator for beginning of const sequence
+ return m_vector.begin();
+ }
+
+ const_iterator end() const {
+ // return iterator for end of const sequence
+ return m_vector.end();
+ }
+
+ const_reference at(size_type _Pos) const {
+ // subscript nonmutable sequence with checking
+ return m_vector.at(_Pos);
+ }
+
+ const_reference operator[](size_type _Pos) const {
+ // subscript nonmutable sequence
+ return m_vector[_Pos];
+ }
+
+ const_reference front() const {
+ // return first element of nonmutable sequence
+ return (*begin());
+ }
+
+ const_reference back() const {
+ // return last element of nonmutable sequence
+ return *(m_vector.back());
+ }
+
+ void push_back(const_reference _Val) {
+ setParent(_Val);
+ m_list.insert(m_fence,_Val);
+ m_vector.push_back(_Val);
+ }
+
+ iterator erase(iterator _Where) {
+ removeParent(*_Where);
+ removeChild(*_Where);
+ return m_vector.erase(_Where.m_iter);
+ }
+
+ iterator erase(iterator _First, iterator _Last) {
+ for (iterator i=_First; i!=_Last; i++) {
+ removeParent(*i);
+ removeChild(*i);
+ }
+ return m_vector.erase(_First,_Last);
+ }
+
+ private:
+ void setParent(const_reference _Val) {
+ if (_Val->getParent())
+ throw XMLObjectException("Child object already has a parent.");
+ _Val->setParent(m_parent);
+ DOMCachingXMLObject* dc=dynamic_cast<DOMCachingXMLObject*>(_Val);
+ if (dc) {
+ dc->releaseParentDOM(true);
+ }
+ }
+
+ void removeParent(const_reference _Val) {
+ if (_Val->getParent()!=m_parent)
+ throw XMLObjectException("Child object not owned by this parent.");
+ _Val->setParent(NULL);
+ DOMCachingXMLObject* dc=dynamic_cast<DOMCachingXMLObject*>(m_parent);
+ if (dc) {
+ dc->releaseParentDOM(true);
+ }
+ }
+
+ void removeChild(const_reference _Val) {
+ for (typename std::list<_Ty*>::iterator i=m_list.begin(); i!=m_list.end(); i++) {
+ if ((*i)==_Val) {
+ m_list.erase(i);
+ delete _Val;
+ return;
+ }
+ }
+ }
+ };
+
+};
+
+#endif /* __xmltooling_list_h__ */