Changeset 9e619e for src/CodePatterns


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/CodePatterns/Observer
Files:
1 added
2 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_ */
Note: See TracChangeset for help on using the changeset viewer.