Changeset 9e619e
- Timestamp:
- Dec 13, 2015, 5:37:05 PM (10 years ago)
- Children:
- afbe20
- Parents:
- ba6aa5
- git-author:
- Frederik Heber <heber@…> (12/13/15 17:01:34)
- git-committer:
- Frederik Heber <heber@…> (12/13/15 17:37:05)
- Location:
- src
- Files:
-
- 1 added
- 5 edited
-
CodePatterns/Observer/ObservedContainer.hpp (modified) (3 diffs)
-
CodePatterns/Observer/ObservedContainer_impl.hpp (modified) (3 diffs)
-
CodePatterns/Observer/UnobservedIterator.hpp (added)
-
Observer/Makefile.am (modified) (1 diff)
-
Observer/unittests/ObservedContainerUnitTest.cpp (modified) (3 diffs)
-
Observer/unittests/ObservedContainerUnitTest.hpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/CodePatterns/Observer/ObservedContainer.hpp
rba6aa5 r9e619e 14 14 #endif 15 15 16 #include <iterator> 16 17 #include <utility> 18 17 19 #include "CodePatterns/Observer/ObservedIterator.hpp" 20 #include "CodePatterns/Observer/UnobservedIterator.hpp" 18 21 19 22 /** … … 24 27 * World class 25 28 */ 26 template <class Container >29 template <class Container, class Iterator = ObservedIterator<Container> > 27 30 class ObservedContainer 28 31 { … … 34 37 typedef typename std::reverse_iterator<internal_iterator> reverse_internal_iterator; 35 38 39 typedef Iterator iterator; 36 40 // typedefs for iterator structure 37 typedef ObservedIterator<set_t> iterator;38 41 typedef typename set_t::const_iterator const_iterator; 39 42 typedef typename std::reverse_iterator<iterator> reverse_iterator; -
src/CodePatterns/Observer/ObservedContainer_impl.hpp
rba6aa5 r9e619e 16 16 #include "CodePatterns/Observer/ObservedContainer.hpp" 17 17 18 template <class Container >19 inline ObservedContainer<Container >::ObservedContainer(Observable* _obs) :18 template <class Container, class Iterator> 19 inline ObservedContainer<Container, Iterator>::ObservedContainer(Observable* _obs) : 20 20 obs(_obs) 21 21 {} 22 22 23 template <class Container >24 inline ObservedContainer<Container >::ObservedContainer(const ObservedContainer<Container> &src) :23 template <class Container, class Iterator> 24 inline ObservedContainer<Container, Iterator>::ObservedContainer(const ObservedContainer<Container, Iterator> &src) : 25 25 content(src.content), 26 26 obs(src.obs) 27 27 {} 28 28 29 template <class Container >30 inline ObservedContainer<Container >::~ObservedContainer()29 template <class Container, class Iterator> 30 inline ObservedContainer<Container, Iterator>::~ObservedContainer() 31 31 {} 32 32 33 template <class Container >34 inline 35 ObservedContainer<Container >&36 ObservedContainer<Container >::operator=(const ObservedContainer<Container> &rhs){33 template <class Container, class Iterator> 34 inline 35 ObservedContainer<Container, Iterator>& 36 ObservedContainer<Container, Iterator>::operator=(const ObservedContainer<Container, Iterator> &rhs){ 37 37 content=rhs.content; 38 38 return *this; 39 39 } 40 40 41 template <class Container >42 inline 43 typename ObservedContainer<Container >::iterator44 ObservedContainer<Container >::begin(){45 return ObservedContainer<Container >::iterator(content.begin(),obs);46 } 47 48 template <class Container >49 inline 50 typename ObservedContainer<Container >::const_iterator51 ObservedContainer<Container >::begin() const{41 template <class Container, class Iterator> 42 inline 43 typename ObservedContainer<Container, Iterator>::iterator 44 ObservedContainer<Container, Iterator>::begin(){ 45 return ObservedContainer<Container, Iterator>::iterator(content.begin(),obs); 46 } 47 48 template <class Container, class Iterator> 49 inline 50 typename ObservedContainer<Container, Iterator>::const_iterator 51 ObservedContainer<Container, Iterator>::begin() const{ 52 52 return content.begin(); 53 53 } 54 54 55 template <class Container >56 inline 57 typename ObservedContainer<Container >::iterator58 ObservedContainer<Container >::end(){59 return ObservedContainer<Container >::iterator(content.end(),obs);60 } 61 62 template <class Container >63 inline 64 typename ObservedContainer<Container >::const_iterator65 ObservedContainer<Container >::end() const{55 template <class Container, class Iterator> 56 inline 57 typename ObservedContainer<Container, Iterator>::iterator 58 ObservedContainer<Container, Iterator>::end(){ 59 return ObservedContainer<Container, Iterator>::iterator(content.end(),obs); 60 } 61 62 template <class Container, class Iterator> 63 inline 64 typename ObservedContainer<Container, Iterator>::const_iterator 65 ObservedContainer<Container, Iterator>::end() const{ 66 66 return content.end(); 67 67 } 68 68 69 template <class Container >70 inline 71 typename ObservedContainer<Container >::reverse_iterator72 ObservedContainer<Container >::rbegin(){69 template <class Container, class Iterator> 70 inline 71 typename ObservedContainer<Container, Iterator>::reverse_iterator 72 ObservedContainer<Container, Iterator>::rbegin(){ 73 73 return reverse_iterator(end()); 74 74 } 75 75 76 template <class Container >77 inline 78 typename ObservedContainer<Container >::const_reverse_iterator79 ObservedContainer<Container >::rbegin() const{76 template <class Container, class Iterator> 77 inline 78 typename ObservedContainer<Container, Iterator>::const_reverse_iterator 79 ObservedContainer<Container, Iterator>::rbegin() const{ 80 80 return const_reverse_iterator(end()); 81 81 } 82 82 83 template <class Container >84 inline 85 typename ObservedContainer<Container >::reverse_iterator86 ObservedContainer<Container >::rend(){83 template <class Container, class Iterator> 84 inline 85 typename ObservedContainer<Container, Iterator>::reverse_iterator 86 ObservedContainer<Container, Iterator>::rend(){ 87 87 return reverse_iterator(begin()); 88 88 } 89 89 90 template <class Container >91 inline 92 typename ObservedContainer<Container >::const_reverse_iterator93 ObservedContainer<Container >::rend() const{90 template <class Container, class Iterator> 91 inline 92 typename ObservedContainer<Container, Iterator>::const_reverse_iterator 93 ObservedContainer<Container, Iterator>::rend() const{ 94 94 return const_reverse_iterator(begin()); 95 95 } 96 96 97 template <class Container >98 inline bool ObservedContainer<Container >::empty() const{97 template <class Container, class Iterator> 98 inline bool ObservedContainer<Container, Iterator>::empty() const{ 99 99 return content.empty(); 100 100 } 101 101 102 template <class Container >103 inline size_t ObservedContainer<Container >::size() const{102 template <class Container, class Iterator> 103 inline size_t ObservedContainer<Container, Iterator>::size() const{ 104 104 return content.size(); 105 105 } 106 106 107 template <class Container >108 inline size_t ObservedContainer<Container >::max_size() const{107 template <class Container, class Iterator> 108 inline size_t ObservedContainer<Container, Iterator>::max_size() const{ 109 109 return content.max_size(); 110 110 } 111 111 112 template <class Container >113 inline 114 typename ObservedContainer<Container >::mapped_type &115 ObservedContainer<Container >::operator[](const key_type &key){112 template <class Container, class Iterator> 113 inline 114 typename ObservedContainer<Container, Iterator>::mapped_type & 115 ObservedContainer<Container, Iterator>::operator[](const key_type &key){ 116 116 return content[key]; 117 117 } 118 118 119 template <class Container >120 inline 121 std::pair<typename ObservedContainer<Container >::iterator,bool>122 ObservedContainer<Container >::insert (const value_type &value){119 template <class Container, class Iterator> 120 inline 121 std::pair<typename ObservedContainer<Container, Iterator>::iterator,bool> 122 ObservedContainer<Container, Iterator>::insert (const value_type &value){ 123 123 std::pair<typename set_t::iterator,bool> res = content.insert(value); 124 124 return std::make_pair(iterator(res.first,obs),res.second); 125 125 } 126 126 127 template <class Container >128 inline size_t ObservedContainer<Container >::erase ( const key_type& x ){127 template <class Container, class Iterator> 128 inline size_t ObservedContainer<Container, Iterator>::erase ( const key_type& x ){ 129 129 return content.erase(x); 130 130 } 131 131 132 template <class Container >133 inline void ObservedContainer<Container >::clear(){132 template <class Container, class Iterator> 133 inline void ObservedContainer<Container, Iterator>::clear(){ 134 134 content.clear(); 135 135 } 136 136 137 template <class Container >138 inline 139 typename ObservedContainer<Container >::iterator140 ObservedContainer<Container >::find ( const key_type& x ){137 template <class Container, class Iterator> 138 inline 139 typename ObservedContainer<Container, Iterator>::iterator 140 ObservedContainer<Container, Iterator>::find ( const key_type& x ){ 141 141 return iterator(content.find(x),obs); 142 142 } 143 143 144 template <class Container >145 inline 146 typename ObservedContainer<Container >::const_iterator147 ObservedContainer<Container >::find ( const key_type& x ) const{144 template <class Container, class Iterator> 145 inline 146 typename ObservedContainer<Container, Iterator>::const_iterator 147 ObservedContainer<Container, Iterator>::find ( const key_type& x ) const{ 148 148 return content.find(x); 149 149 } 150 150 151 template <class Container >152 inline size_t ObservedContainer<Container >::count ( const key_type& x ) const{151 template <class Container, class Iterator> 152 inline size_t ObservedContainer<Container, Iterator>::count ( const key_type& x ) const{ 153 153 return content.count(x); 154 154 } … … 156 156 /************ Unprotected access ***************/ 157 157 158 template <class Container >159 inline 160 typename ObservedContainer<Container >::internal_iterator161 ObservedContainer<Container >::begin_internal(){158 template <class Container, class Iterator> 159 inline 160 typename ObservedContainer<Container, Iterator>::internal_iterator 161 ObservedContainer<Container, Iterator>::begin_internal(){ 162 162 return content.begin(); 163 163 } 164 164 165 template <class Container >166 inline 167 typename ObservedContainer<Container >::internal_iterator168 ObservedContainer<Container >::end_internal(){165 template <class Container, class Iterator> 166 inline 167 typename ObservedContainer<Container, Iterator>::internal_iterator 168 ObservedContainer<Container, Iterator>::end_internal(){ 169 169 return content.end(); 170 170 } 171 171 172 template <class Container >173 inline 174 typename ObservedContainer<Container >::reverse_internal_iterator175 ObservedContainer<Container >::rbegin_internal(){172 template <class Container, class Iterator> 173 inline 174 typename ObservedContainer<Container, Iterator>::reverse_internal_iterator 175 ObservedContainer<Container, Iterator>::rbegin_internal(){ 176 176 return content.rbegin(); 177 177 } 178 178 179 template <class Container >180 inline 181 typename ObservedContainer<Container >::reverse_internal_iterator182 ObservedContainer<Container >::rend_internal(){179 template <class Container, class Iterator> 180 inline 181 typename ObservedContainer<Container, Iterator>::reverse_internal_iterator 182 ObservedContainer<Container, Iterator>::rend_internal(){ 183 183 return content.rend(); 184 184 } 185 185 186 template <class Container >187 inline 188 typename ObservedContainer<Container >::set_t &189 ObservedContainer<Container >::getContent(){186 template <class Container, class Iterator> 187 inline 188 typename ObservedContainer<Container, Iterator>::set_t & 189 ObservedContainer<Container, Iterator>::getContent(){ 190 190 return content; 191 191 } … … 193 193 /************ Explicit instantiation ***************/ 194 194 195 #define CONSTRUCT_OBSERVEDCONTAINER( name) \196 template ObservedContainer< name >& ObservedContainer< name >::operator=(const ObservedContainer<name >&); \197 template ObservedContainer< name >::iterator ObservedContainer<name >::begin(); \198 template ObservedContainer< name >::const_iterator ObservedContainer<name >::begin() const; \199 template ObservedContainer< name >::iterator ObservedContainer<name >::end(); \200 template ObservedContainer< name >::const_iterator ObservedContainer<name >::end() const; \201 template ObservedContainer< name >::reverse_iterator ObservedContainer<name >::rbegin(); \202 template ObservedContainer< name >::const_reverse_iterator ObservedContainer<name >::rbegin() const; \203 template ObservedContainer< name >::reverse_iterator ObservedContainer<name >::rend(); \204 template ObservedContainer< name >::const_reverse_iterator ObservedContainer<name >::rend() const; \205 template bool ObservedContainer< name >::empty() const; \206 template size_t ObservedContainer< name >::size() const; \207 template size_t ObservedContainer< name >::max_size() const; \208 template ObservedContainer< name >::mapped_type &ObservedContainer<name >::operator[](const key_type&); \209 template std::pair<ObservedContainer< name >::iterator,bool> ObservedContainer<name >::insert (const value_type&); \210 template size_t ObservedContainer< name >::erase ( const key_type& x ); \211 template void ObservedContainer< name >::clear(); \212 template ObservedContainer< name >::iterator ObservedContainer<name >::find ( const key_type& x ); \213 template ObservedContainer< name >::const_iterator ObservedContainer<name >::find ( const key_type& x ) const; \214 template size_t ObservedContainer< name >::count ( const key_type& x ) const; \215 template ObservedContainer< name >::internal_iterator ObservedContainer<name >::begin_internal(); \216 template ObservedContainer< name >::reverse_internal_iterator ObservedContainer<name >::rbegin_internal(); \217 template ObservedContainer< name >::internal_iterator ObservedContainer<name >::end_internal(); \218 template ObservedContainer< name >::reverse_internal_iterator ObservedContainer<name >::rend_internal(); \195 #define CONSTRUCT_OBSERVEDCONTAINER(container, name) \ 196 template ObservedContainer< container, name >& ObservedContainer< container, name >::operator=(const ObservedContainer< container, name >&); \ 197 template ObservedContainer< container, name >::iterator ObservedContainer< container, name >::begin(); \ 198 template ObservedContainer< container, name >::const_iterator ObservedContainer< container, name >::begin() const; \ 199 template ObservedContainer< container, name >::iterator ObservedContainer< container, name >::end(); \ 200 template ObservedContainer< container, name >::const_iterator ObservedContainer< container, name >::end() const; \ 201 template ObservedContainer< container, name >::reverse_iterator ObservedContainer< container, name >::rbegin(); \ 202 template ObservedContainer< container, name >::const_reverse_iterator ObservedContainer< container, name >::rbegin() const; \ 203 template ObservedContainer< container, name >::reverse_iterator ObservedContainer< container, name >::rend(); \ 204 template ObservedContainer< container, name >::const_reverse_iterator ObservedContainer< container, name >::rend() const; \ 205 template bool ObservedContainer< container, name >::empty() const; \ 206 template size_t ObservedContainer< container, name >::size() const; \ 207 template size_t ObservedContainer< container, name >::max_size() const; \ 208 template ObservedContainer< container, name >::mapped_type &ObservedContainer< container, name >::operator[](const key_type&); \ 209 template std::pair<ObservedContainer< container, name >::iterator,bool> ObservedContainer< container, name >::insert (const value_type&); \ 210 template size_t ObservedContainer< container, name >::erase ( const key_type& x ); \ 211 template void ObservedContainer< container, name >::clear(); \ 212 template ObservedContainer< container, name >::iterator ObservedContainer< container, name >::find ( const key_type& x ); \ 213 template ObservedContainer< container, name >::const_iterator ObservedContainer< container, name >::find ( const key_type& x ) const; \ 214 template size_t ObservedContainer< container, name >::count ( const key_type& x ) const; \ 215 template ObservedContainer< container, name >::internal_iterator ObservedContainer< container, name >::begin_internal(); \ 216 template ObservedContainer< container, name >::reverse_internal_iterator ObservedContainer< container, name >::rbegin_internal(); \ 217 template ObservedContainer< container, name >::internal_iterator ObservedContainer< container, name >::end_internal(); \ 218 template ObservedContainer< container, name >::reverse_internal_iterator ObservedContainer< container, name >::rend_internal(); \ 219 219 220 220 #endif /* OBSERVEDCONTAINER_IMPL_HPP_ */ -
src/Observer/Makefile.am
rba6aa5 r9e619e 32 32 $(top_srcdir)/src/CodePatterns/Observer/ObservedIterator.hpp \ 33 33 $(top_srcdir)/src/CodePatterns/Observer/ObservedContainer_impl.hpp \ 34 $(top_srcdir)/src/CodePatterns/Observer/UnobservedIterator.hpp \ 34 35 $(top_srcdir)/src/CodePatterns/Observer/Relay.hpp \ 35 36 $(top_srcdir)/src/CodePatterns/Observer/Zombie.hpp -
src/Observer/unittests/ObservedContainerUnitTest.cpp
rba6aa5 r9e619e 30 30 #include "CodePatterns/Observer/ObservedContainer.hpp" 31 31 #include "CodePatterns/Observer/ObservedContainer_impl.hpp" 32 #include "CodePatterns/Observer/ObservedIterator.hpp" 33 #include "CodePatterns/Observer/UnobservedIterator.hpp" 32 34 33 35 #include "ObservedContainerUnitTest.hpp" … … 56 58 void ObservedContainerTest::IteratorMapTest() 57 59 { 58 typedef ObservedContainer< std::map<int, int> > OC;60 typedef ObservedContainer< std::map<int, int>, ObservedIterator<std::map<int, int> > > OC; 59 61 OC OContainer(simpleObservable1); 60 62 int i; … … 121 123 } 122 124 125 void ObservedContainerTest::IteratorMapNotObservedTest() 126 { 127 typedef ObservedContainer< std::map<int, int>, UnobservedIterator<std::map<int, int> > > OC; 128 OC OContainer(simpleObservable1); 129 int i; 130 131 OContainer.insert( std::pair<int,int> (1,1) ); 132 OContainer.insert( std::pair<int,int> (2,2) ); 133 134 i=0; 135 for (OC::internal_iterator iter = OContainer.begin_internal(); iter != OContainer.end_internal(); ++iter) { 136 i++; 137 CPPUNIT_ASSERT_EQUAL(i, iter->first); 138 CPPUNIT_ASSERT_EQUAL(i, iter->second); 139 } 140 CPPUNIT_ASSERT_EQUAL(i,2); 141 142 i=0; 143 for (OC::iterator iter = OContainer.begin(); iter != OContainer.end(); ++iter) { 144 i++; 145 CPPUNIT_ASSERT_EQUAL(i, iter->first); 146 CPPUNIT_ASSERT_EQUAL(i, iter->second); 147 } 148 CPPUNIT_ASSERT_EQUAL(i,2); 149 150 i=0; 151 for (OC::const_iterator iter = OContainer.begin(); iter != OContainer.end(); ++iter) { 152 i++; 153 CPPUNIT_ASSERT_EQUAL(i, iter->first); 154 CPPUNIT_ASSERT_EQUAL(i, iter->second); 155 } 156 CPPUNIT_ASSERT_EQUAL(i,2); 157 158 i=3; 159 for (OC::reverse_internal_iterator iter = OContainer.rbegin_internal(); iter != OContainer.rend_internal(); ++iter) { 160 i--; 161 CPPUNIT_ASSERT_EQUAL(i, iter->first); 162 CPPUNIT_ASSERT_EQUAL(i, iter->second); 163 } 164 CPPUNIT_ASSERT_EQUAL(i,1); 165 166 /* @todo TODO: Check whether dereferencing ObservedContainer::reverse_iterator 167 * is working now. 168 * I am quite convinced that the reason for us having to use a 169 * const_reverse_iterator below is in stl_iterator.h, where operator* is 170 * implemented with a temporary _Iterator that is returned, i.e. a 171 * temporary object and we are not allowed to dereference from this 172 * temporary object. 173 */ 174 i=3; 175 for (OC::reverse_iterator iter = OContainer.rbegin(); iter != OContainer.rend(); ++iter) { 176 i--; 177 OC::const_reverse_iterator helper = iter; 178 CPPUNIT_ASSERT_EQUAL(i, helper->first); 179 CPPUNIT_ASSERT_EQUAL(i, helper->second); 180 } 181 CPPUNIT_ASSERT_EQUAL(i,1); 182 183 i=3; 184 for (OC::const_reverse_iterator iter = OContainer.rbegin(); iter != OContainer.rend(); ++iter) { 185 i--; 186 CPPUNIT_ASSERT_EQUAL(i, iter->first); 187 CPPUNIT_ASSERT_EQUAL(i, iter->second); 188 } 189 CPPUNIT_ASSERT_EQUAL(i,1); 190 } 191 123 192 // @todo TODO: Check whether ObservedContainer with sets not maps is working now 124 193 void ObservedContainerTest::IteratorSetTest() 125 194 { 126 // typedef ObservedContainer< std::set<int> > OC;195 // typedef ObservedContainer< std::set<int>, ObservedIterator<std::set<int> > > OC; 127 196 // OC OContainer(simpleObservable1); 128 197 // int i; -
src/Observer/unittests/ObservedContainerUnitTest.hpp
rba6aa5 r9e619e 31 31 CPPUNIT_TEST_SUITE( ObservedContainerTest ) ; 32 32 CPPUNIT_TEST ( IteratorMapTest ); 33 CPPUNIT_TEST ( IteratorMapNotObservedTest ); 33 34 CPPUNIT_TEST ( IteratorSetTest ); 34 35 CPPUNIT_TEST_SUITE_END(); … … 39 40 40 41 void IteratorMapTest(); 42 void IteratorMapNotObservedTest(); 41 43 void IteratorSetTest(); 42 44
Note:
See TracChangeset
for help on using the changeset viewer.
