Changeset 9e619e


Ignore:
Timestamp:
Dec 13, 2015, 5:37:05 PM (10 years ago)
Author:
Frederik Heber <heber@…>
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)
Message:

Added UnobservedIterator to allow for an "unobserved" ObservedContainer.

Location:
src
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • src/CodePatterns/Observer/ObservedContainer.hpp

    rba6aa5 r9e619e  
    1414#endif
    1515
     16#include <iterator>
    1617#include <utility>
     18
    1719#include "CodePatterns/Observer/ObservedIterator.hpp"
     20#include "CodePatterns/Observer/UnobservedIterator.hpp"
    1821
    1922/**
     
    2427 * World class
    2528 */
    26 template <class Container>
     29template <class Container, class Iterator = ObservedIterator<Container> >
    2730class ObservedContainer
    2831{
     
    3437  typedef typename std::reverse_iterator<internal_iterator>     reverse_internal_iterator;
    3538
     39  typedef Iterator iterator;
    3640  // typedefs for iterator structure
    37   typedef ObservedIterator<set_t>                               iterator;
    3841  typedef typename set_t::const_iterator                        const_iterator;
    3942  typedef typename std::reverse_iterator<iterator>              reverse_iterator;
  • src/CodePatterns/Observer/ObservedContainer_impl.hpp

    rba6aa5 r9e619e  
    1616#include "CodePatterns/Observer/ObservedContainer.hpp"
    1717
    18 template <class Container>
    19 inline ObservedContainer<Container>::ObservedContainer(Observable* _obs) :
     18template <class Container, class Iterator>
     19inline ObservedContainer<Container, Iterator>::ObservedContainer(Observable* _obs) :
    2020  obs(_obs)
    2121{}
    2222
    23 template <class Container>
    24 inline ObservedContainer<Container>::ObservedContainer(const ObservedContainer<Container> &src) :
     23template <class Container, class Iterator>
     24inline ObservedContainer<Container, Iterator>::ObservedContainer(const ObservedContainer<Container, Iterator> &src) :
    2525  content(src.content),
    2626  obs(src.obs)
    2727{}
    2828
    29 template <class Container>
    30 inline ObservedContainer<Container>::~ObservedContainer()
     29template <class Container, class Iterator>
     30inline ObservedContainer<Container, Iterator>::~ObservedContainer()
    3131{}
    3232
    33 template <class Container>
    34 inline
    35 ObservedContainer<Container>&
    36 ObservedContainer<Container>::operator=(const ObservedContainer<Container> &rhs){
     33template <class Container, class Iterator>
     34inline
     35ObservedContainer<Container, Iterator>&
     36ObservedContainer<Container, Iterator>::operator=(const ObservedContainer<Container, Iterator> &rhs){
    3737  content=rhs.content;
    3838  return *this;
    3939}
    4040
    41 template <class Container>
    42 inline
    43 typename ObservedContainer<Container>::iterator
    44 ObservedContainer<Container>::begin(){
    45   return ObservedContainer<Container>::iterator(content.begin(),obs);
    46 }
    47 
    48 template <class Container>
    49 inline
    50 typename ObservedContainer<Container>::const_iterator
    51 ObservedContainer<Container>::begin() const{
     41template <class Container, class Iterator>
     42inline
     43typename ObservedContainer<Container, Iterator>::iterator
     44ObservedContainer<Container, Iterator>::begin(){
     45  return ObservedContainer<Container, Iterator>::iterator(content.begin(),obs);
     46}
     47
     48template <class Container, class Iterator>
     49inline
     50typename ObservedContainer<Container, Iterator>::const_iterator
     51ObservedContainer<Container, Iterator>::begin() const{
    5252  return content.begin();
    5353}
    5454
    55 template <class Container>
    56 inline
    57 typename ObservedContainer<Container>::iterator
    58 ObservedContainer<Container>::end(){
    59   return ObservedContainer<Container>::iterator(content.end(),obs);
    60 }
    61 
    62 template <class Container>
    63 inline
    64 typename ObservedContainer<Container>::const_iterator
    65 ObservedContainer<Container>::end() const{
     55template <class Container, class Iterator>
     56inline
     57typename ObservedContainer<Container, Iterator>::iterator
     58ObservedContainer<Container, Iterator>::end(){
     59  return ObservedContainer<Container, Iterator>::iterator(content.end(),obs);
     60}
     61
     62template <class Container, class Iterator>
     63inline
     64typename ObservedContainer<Container, Iterator>::const_iterator
     65ObservedContainer<Container, Iterator>::end() const{
    6666  return content.end();
    6767}
    6868
    69 template <class Container>
    70 inline
    71 typename ObservedContainer<Container>::reverse_iterator
    72 ObservedContainer<Container>::rbegin(){
     69template <class Container, class Iterator>
     70inline
     71typename ObservedContainer<Container, Iterator>::reverse_iterator
     72ObservedContainer<Container, Iterator>::rbegin(){
    7373  return reverse_iterator(end());
    7474}
    7575
    76 template <class Container>
    77 inline
    78 typename ObservedContainer<Container>::const_reverse_iterator
    79 ObservedContainer<Container>::rbegin() const{
     76template <class Container, class Iterator>
     77inline
     78typename ObservedContainer<Container, Iterator>::const_reverse_iterator
     79ObservedContainer<Container, Iterator>::rbegin() const{
    8080  return const_reverse_iterator(end());
    8181}
    8282
    83 template <class Container>
    84 inline
    85 typename ObservedContainer<Container>::reverse_iterator
    86 ObservedContainer<Container>::rend(){
     83template <class Container, class Iterator>
     84inline
     85typename ObservedContainer<Container, Iterator>::reverse_iterator
     86ObservedContainer<Container, Iterator>::rend(){
    8787  return reverse_iterator(begin());
    8888}
    8989
    90 template <class Container>
    91 inline
    92 typename ObservedContainer<Container>::const_reverse_iterator
    93 ObservedContainer<Container>::rend() const{
     90template <class Container, class Iterator>
     91inline
     92typename ObservedContainer<Container, Iterator>::const_reverse_iterator
     93ObservedContainer<Container, Iterator>::rend() const{
    9494  return const_reverse_iterator(begin());
    9595}
    9696
    97 template <class Container>
    98 inline bool ObservedContainer<Container>::empty() const{
     97template <class Container, class Iterator>
     98inline bool ObservedContainer<Container, Iterator>::empty() const{
    9999  return content.empty();
    100100}
    101101
    102 template <class Container>
    103 inline size_t ObservedContainer<Container>::size() const{
     102template <class Container, class Iterator>
     103inline size_t ObservedContainer<Container, Iterator>::size() const{
    104104  return content.size();
    105105}
    106106
    107 template <class Container>
    108 inline size_t ObservedContainer<Container>::max_size() const{
     107template <class Container, class Iterator>
     108inline size_t ObservedContainer<Container, Iterator>::max_size() const{
    109109  return content.max_size();
    110110}
    111111
    112 template <class Container>
    113 inline
    114 typename ObservedContainer<Container>::mapped_type &
    115 ObservedContainer<Container>::operator[](const key_type &key){
     112template <class Container, class Iterator>
     113inline
     114typename ObservedContainer<Container, Iterator>::mapped_type &
     115ObservedContainer<Container, Iterator>::operator[](const key_type &key){
    116116  return content[key];
    117117}
    118118
    119 template <class Container>
    120 inline
    121 std::pair<typename ObservedContainer<Container>::iterator,bool>
    122 ObservedContainer<Container>::insert (const value_type &value){
     119template <class Container, class Iterator>
     120inline
     121std::pair<typename ObservedContainer<Container, Iterator>::iterator,bool>
     122ObservedContainer<Container, Iterator>::insert (const value_type &value){
    123123  std::pair<typename set_t::iterator,bool> res = content.insert(value);
    124124  return std::make_pair(iterator(res.first,obs),res.second);
    125125}
    126126
    127 template <class Container>
    128 inline size_t ObservedContainer<Container>::erase ( const key_type& x ){
     127template <class Container, class Iterator>
     128inline size_t ObservedContainer<Container, Iterator>::erase ( const key_type& x ){
    129129  return content.erase(x);
    130130}
    131131
    132 template <class Container>
    133 inline void ObservedContainer<Container>::clear(){
     132template <class Container, class Iterator>
     133inline void ObservedContainer<Container, Iterator>::clear(){
    134134  content.clear();
    135135}
    136136
    137 template <class Container>
    138 inline
    139 typename ObservedContainer<Container>::iterator
    140 ObservedContainer<Container>::find ( const key_type& x ){
     137template <class Container, class Iterator>
     138inline
     139typename ObservedContainer<Container, Iterator>::iterator
     140ObservedContainer<Container, Iterator>::find ( const key_type& x ){
    141141  return iterator(content.find(x),obs);
    142142}
    143143
    144 template <class Container>
    145 inline
    146 typename ObservedContainer<Container>::const_iterator
    147 ObservedContainer<Container>::find ( const key_type& x ) const{
     144template <class Container, class Iterator>
     145inline
     146typename ObservedContainer<Container, Iterator>::const_iterator
     147ObservedContainer<Container, Iterator>::find ( const key_type& x ) const{
    148148  return content.find(x);
    149149}
    150150
    151 template <class Container>
    152 inline size_t ObservedContainer<Container>::count ( const key_type& x ) const{
     151template <class Container, class Iterator>
     152inline size_t ObservedContainer<Container, Iterator>::count ( const key_type& x ) const{
    153153  return content.count(x);
    154154}
     
    156156/************ Unprotected access ***************/
    157157
    158 template <class Container>
    159 inline
    160 typename ObservedContainer<Container>::internal_iterator
    161 ObservedContainer<Container>::begin_internal(){
     158template <class Container, class Iterator>
     159inline
     160typename ObservedContainer<Container, Iterator>::internal_iterator
     161ObservedContainer<Container, Iterator>::begin_internal(){
    162162  return content.begin();
    163163}
    164164
    165 template <class Container>
    166 inline
    167 typename ObservedContainer<Container>::internal_iterator
    168 ObservedContainer<Container>::end_internal(){
     165template <class Container, class Iterator>
     166inline
     167typename ObservedContainer<Container, Iterator>::internal_iterator
     168ObservedContainer<Container, Iterator>::end_internal(){
    169169  return content.end();
    170170}
    171171
    172 template <class Container>
    173 inline
    174 typename ObservedContainer<Container>::reverse_internal_iterator
    175 ObservedContainer<Container>::rbegin_internal(){
     172template <class Container, class Iterator>
     173inline
     174typename ObservedContainer<Container, Iterator>::reverse_internal_iterator
     175ObservedContainer<Container, Iterator>::rbegin_internal(){
    176176  return content.rbegin();
    177177}
    178178
    179 template <class Container>
    180 inline
    181 typename ObservedContainer<Container>::reverse_internal_iterator
    182 ObservedContainer<Container>::rend_internal(){
     179template <class Container, class Iterator>
     180inline
     181typename ObservedContainer<Container, Iterator>::reverse_internal_iterator
     182ObservedContainer<Container, Iterator>::rend_internal(){
    183183  return content.rend();
    184184}
    185185
    186 template <class Container>
    187 inline
    188 typename ObservedContainer<Container>::set_t &
    189 ObservedContainer<Container>::getContent(){
     186template <class Container, class Iterator>
     187inline
     188typename ObservedContainer<Container, Iterator>::set_t &
     189ObservedContainer<Container, Iterator>::getContent(){
    190190  return content;
    191191}
     
    193193/************ Explicit instantiation ***************/
    194194
    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(); \
    219219
    220220#endif /* OBSERVEDCONTAINER_IMPL_HPP_ */
  • src/Observer/Makefile.am

    rba6aa5 r9e619e  
    3232        $(top_srcdir)/src/CodePatterns/Observer/ObservedIterator.hpp \
    3333        $(top_srcdir)/src/CodePatterns/Observer/ObservedContainer_impl.hpp \
     34        $(top_srcdir)/src/CodePatterns/Observer/UnobservedIterator.hpp \
    3435        $(top_srcdir)/src/CodePatterns/Observer/Relay.hpp \
    3536        $(top_srcdir)/src/CodePatterns/Observer/Zombie.hpp
  • src/Observer/unittests/ObservedContainerUnitTest.cpp

    rba6aa5 r9e619e  
    3030#include "CodePatterns/Observer/ObservedContainer.hpp"
    3131#include "CodePatterns/Observer/ObservedContainer_impl.hpp"
     32#include "CodePatterns/Observer/ObservedIterator.hpp"
     33#include "CodePatterns/Observer/UnobservedIterator.hpp"
    3234
    3335#include "ObservedContainerUnitTest.hpp"
     
    5658void ObservedContainerTest::IteratorMapTest()
    5759{
    58   typedef ObservedContainer< std::map<int, int> > OC;
     60  typedef ObservedContainer< std::map<int, int>, ObservedIterator<std::map<int, int> > > OC;
    5961  OC OContainer(simpleObservable1);
    6062  int i;
     
    121123}
    122124
     125void 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
    123192// @todo TODO: Check whether ObservedContainer with sets not maps is working now
    124193void ObservedContainerTest::IteratorSetTest()
    125194{
    126 //  typedef ObservedContainer< std::set<int> > OC;
     195//  typedef ObservedContainer< std::set<int>, ObservedIterator<std::set<int> > > OC;
    127196//  OC OContainer(simpleObservable1);
    128197//  int i;
  • src/Observer/unittests/ObservedContainerUnitTest.hpp

    rba6aa5 r9e619e  
    3131  CPPUNIT_TEST_SUITE( ObservedContainerTest ) ;
    3232  CPPUNIT_TEST ( IteratorMapTest );
     33  CPPUNIT_TEST ( IteratorMapNotObservedTest );
    3334  CPPUNIT_TEST ( IteratorSetTest );
    3435  CPPUNIT_TEST_SUITE_END();
     
    3940
    4041  void IteratorMapTest();
     42  void IteratorMapNotObservedTest();
    4143  void IteratorSetTest();
    4244
Note: See TracChangeset for help on using the changeset viewer.