Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/ScopedMap.h

    rdf00c78 r6dba8755  
    1010// Created On       : Wed Dec 2 11:37:00 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb 15 08:41:28 2022
    13 // Update Count     : 5
     12// Last Modified On : Mon May 21 15:22:40 2018
     13// Update Count     : 3
    1414//
    1515
     
    3636
    3737                template<typename N>
    38                 Scope(N && n) : map(), note(std::forward<N>(n)) {}
     38                Scope(N&& n) : map(), note(std::forward<N>(n)) {}
    3939               
    4040                Scope() = default;
    41                 Scope(const Scope &) = default;
    42                 Scope(Scope &&) = default;
    43                 Scope & operator= (const Scope &) = default;
    44                 Scope & operator= (Scope &&) = default;
     41                Scope(const Scope&) = default;
     42                Scope(Scope&&) = default;
     43                Scope& operator= (const Scope&) = default;
     44                Scope& operator= (Scope&&) = default;
    4545        };
    4646        typedef std::vector< Scope > ScopeList;
     
    5858        typedef typename MapType::const_pointer const_pointer;
    5959
    60         class iterator : public std::iterator< std::bidirectional_iterator_tag, value_type > {
     60        class iterator : public std::iterator< std::bidirectional_iterator_tag,
     61                                               value_type > {
    6162        friend class ScopedMap;
    6263        friend class const_iterator;
     
    7172
    7273                /// Increments on invalid
    73                 iterator & next_valid() {
     74                iterator& next_valid() {
    7475                        if ( ! is_valid() ) { ++(*this); }
    7576                        return *this;
     
    7778
    7879                /// Decrements on invalid
    79                 iterator & prev_valid() {
     80                iterator& prev_valid() {
    8081                        if ( ! is_valid() ) { --(*this); }
    8182                        return *this;
    8283                }
    8384
    84                 iterator(scope_list & _scopes, const wrapped_iterator & _it, size_type inLevel)
     85                iterator(scope_list &_scopes, const wrapped_iterator &_it, size_type inLevel)
    8586                        : scopes(&_scopes), it(_it), level(inLevel) {}
    8687        public:
    87                 iterator(const iterator & that) : scopes(that.scopes), it(that.it), level(that.level) {}
    88                 iterator & operator= (const iterator & that) {
     88                iterator(const iterator &that) : scopes(that.scopes), it(that.it), level(that.level) {}
     89                iterator& operator= (const iterator &that) {
    8990                        scopes = that.scopes; level = that.level; it = that.it;
    9091                        return *this;
     
    9495                pointer operator-> () const { return it.operator->(); }
    9596
    96                 iterator & operator++ () {
     97                iterator& operator++ () {
    9798                        if ( it == (*scopes)[level].map.end() ) {
    9899                                if ( level == 0 ) return *this;
     
    106107                iterator operator++ (int) { iterator tmp = *this; ++(*this); return tmp; }
    107108
    108                 iterator & operator-- () {
     109                iterator& operator-- () {
    109110                        // may fail if this is the begin iterator; allowed by STL spec
    110111                        if ( it == (*scopes)[level].map.begin() ) {
     
    117118                iterator operator-- (int) { iterator tmp = *this; --(*this); return tmp; }
    118119
    119                 bool operator== (const iterator & that) const {
     120                bool operator== (const iterator &that) const {
    120121                        return scopes == that.scopes && level == that.level && it == that.it;
    121122                }
    122                 bool operator!= (const iterator & that) const { return !( *this == that ); }
     123                bool operator!= (const iterator &that) const { return !( *this == that ); }
    123124
    124125                size_type get_level() const { return level; }
    125126
    126                 Note & get_note() { return (*scopes)[level].note; }
    127                 const Note & get_note() const { return (*scopes)[level].note; }
     127                Note& get_note() { return (*scopes)[level].note; }
     128                const Note& get_note() const { return (*scopes)[level].note; }
    128129
    129130        private:
     
    147148
    148149                /// Increments on invalid
    149                 const_iterator & next_valid() {
     150                const_iterator& next_valid() {
    150151                        if ( ! is_valid() ) { ++(*this); }
    151152                        return *this;
     
    153154
    154155                /// Decrements on invalid
    155                 const_iterator & prev_valid() {
     156                const_iterator& prev_valid() {
    156157                        if ( ! is_valid() ) { --(*this); }
    157158                        return *this;
    158159                }
    159160
    160                 const_iterator(scope_list const & _scopes, const wrapped_const_iterator & _it, size_type inLevel)
     161                const_iterator(scope_list const &_scopes, const wrapped_const_iterator &_it, size_type inLevel)
    161162                        : scopes(&_scopes), it(_it), level(inLevel) {}
    162163        public:
    163                 const_iterator(const iterator & that) : scopes(that.scopes), it(that.it), level(that.level) {}
    164                 const_iterator(const const_iterator & that) : scopes(that.scopes), it(that.it), level(that.level) {}
    165                 const_iterator & operator= (const iterator & that) {
     164                const_iterator(const iterator &that) : scopes(that.scopes), it(that.it), level(that.level) {}
     165                const_iterator(const const_iterator &that) : scopes(that.scopes), it(that.it), level(that.level) {}
     166                const_iterator& operator= (const iterator &that) {
    166167                        scopes = that.scopes; level = that.level; it = that.it;
    167168                        return *this;
    168169                }
    169                 const_iterator & operator= (const const_iterator & that) {
     170                const_iterator& operator= (const const_iterator &that) {
    170171                        scopes = that.scopes; level = that.level; it = that.it;
    171172                        return *this;
     
    175176                const_pointer operator-> () { return it.operator->(); }
    176177
    177                 const_iterator & operator++ () {
     178                const_iterator& operator++ () {
    178179                        if ( it == (*scopes)[level].map.end() ) {
    179180                                if ( level == 0 ) return *this;
     
    187188                const_iterator operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; }
    188189
    189                 const_iterator & operator-- () {
     190                const_iterator& operator-- () {
    190191                        // may fail if this is the begin iterator; allowed by STL spec
    191192                        if ( it == (*scopes)[level].map.begin() ) {
     
    198199                const_iterator operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; }
    199200
    200                 bool operator== (const const_iterator & that) const {
     201                bool operator== (const const_iterator &that) const {
    201202                        return scopes == that.scopes && level == that.level && it == that.it;
    202203                }
    203                 bool operator!= (const const_iterator & that) const { return !( *this == that ); }
     204                bool operator!= (const const_iterator &that) const { return !( *this == that ); }
    204205
    205206                size_type get_level() const { return level; }
    206207
    207                 const Note & get_note() const { return (*scopes)[level].note; }
     208                const Note& get_note() const { return (*scopes)[level].note; }
    208209
    209210        private:
     
    220221        // Starts a new scope with the given note
    221222        template<typename N>
    222         void beginScope( N && n ) {
     223        void beginScope( N&& n ) {
    223224                scopes.emplace_back( std::forward<N>(n) );
    224225        }
     
    235236        /// Constructs with a given note on the outermost scope
    236237        template<typename N>
    237         ScopedMap( N && n ) : scopes() { beginScope(std::forward<N>(n)); }
     238        ScopedMap( N&& n ) : scopes() { beginScope(std::forward<N>(n)); }
    238239
    239240        iterator begin() { return iterator(scopes, scopes.back().map.begin(), currentScope()).next_valid(); }
     
    248249
    249250        /// Gets the note at the given scope
    250         Note & getNote() { return scopes.back().note; }
    251         const Note & getNote() const { return scopes.back().note; }
    252         Note & getNote( size_type i ) { return scopes[i].note; }
    253         const Note & getNote( size_type i ) const { return scopes[i].note; }
     251        Note& getNote( size_type i ) { return scopes[i].note; }
     252        const Note& getNote( size_type i ) const { return scopes[i].note; }
    254253
    255254        /// Finds the given key in the outermost scope it occurs; returns end() for none such
    256         iterator find( const Key & key ) {
     255        iterator find( const Key &key ) {
    257256                for ( size_type i = scopes.size() - 1; ; --i ) {
    258257                        typename MapType::iterator val = scopes[i].map.find( key );
     
    262261                return end();
    263262        }
    264         const_iterator find( const Key & key ) const {
     263        const_iterator find( const Key &key ) const {
    265264                        return const_iterator( const_cast< ScopedMap< Key, Value, Note >* >(this)->find( key ) );
    266265        }
    267266
    268267        /// Finds the given key in the provided scope; returns end() for none such
    269         iterator findAt( size_type scope, const Key & key ) {
     268        iterator findAt( size_type scope, const Key& key ) {
    270269                typename MapType::iterator val = scopes[scope].map.find( key );
    271270                if ( val != scopes[scope].map.end() ) return iterator( scopes, val, scope );
    272271                return end();
    273272        }
    274         const_iterator findAt( size_type scope, const Key & key ) const {
     273        const_iterator findAt( size_type scope, const Key& key ) const {
    275274                return const_iterator( const_cast< ScopedMap< Key, Value, Note >* >(this)->findAt( scope, key ) );
    276275        }
    277276
    278277        /// Finds the given key in the outermost scope inside the given scope where it occurs
    279         iterator findNext( const_iterator & it, const Key & key ) {
     278        iterator findNext( const_iterator &it, const Key &key ) {
    280279                if ( it.level == 0 ) return end();
    281280                for ( size_type i = it.level - 1; ; --i ) {
     
    286285                return end();
    287286        }
    288         const_iterator findNext( const_iterator & it, const Key & key ) const {
     287        const_iterator findNext( const_iterator &it, const Key &key ) const {
    289288                        return const_iterator( const_cast< ScopedMap< Key, Value, Note >* >(this)->findNext( it, key ) );
    290289        }
     
    292291        /// Inserts the given key-value pair into the outermost scope
    293292        template< typename value_type_t >
    294         std::pair< iterator, bool > insert( value_type_t && value ) {
     293        std::pair< iterator, bool > insert( value_type_t&& value ) {
    295294                std::pair< typename MapType::iterator, bool > res = scopes.back().map.insert( std::forward<value_type_t>( value ) );
    296295                return std::make_pair( iterator(scopes, std::move( res.first ), scopes.size()-1), std::move( res.second ) );
     
    298297
    299298        template< typename value_type_t >
    300         std::pair< iterator, bool > insert( iterator at, value_type_t && value ) {
    301                 MapType & scope = (*at.scopes)[ at.level ].map;
     299        std::pair< iterator, bool > insert( iterator at, value_type_t&& value ) {
     300                MapType& scope = (*at.scopes)[ at.level ].map;
    302301                std::pair< typename MapType::iterator, bool > res = scope.insert( std::forward<value_type_t>( value ) );
    303302                return std::make_pair( iterator(scopes, std::move( res.first ), at.level), std::move( res.second ) );
     
    305304
    306305        template< typename value_t >
    307         std::pair< iterator, bool > insert( const Key & key, value_t && value ) { return insert( std::make_pair( key, std::forward<value_t>( value ) ) ); }
     306        std::pair< iterator, bool > insert( const Key &key, value_t&& value ) { return insert( std::make_pair( key, std::forward<value_t>( value ) ) ); }
    308307
    309308        template< typename value_type_t >
    310         std::pair< iterator, bool > insertAt( size_type scope, value_type_t && value ) {
     309        std::pair< iterator, bool > insertAt( size_type scope, value_type_t&& value ) {
    311310                std::pair< typename MapType::iterator, bool > res = scopes.at(scope).map.insert( std::forward<value_type_t>( value ) );
    312311                return std::make_pair( iterator(scopes, std::move( res.first ), scope), std::move( res.second ) );
     
    314313
    315314        template< typename value_t >
    316         std::pair< iterator, bool > insertAt( size_type scope, const Key & key, value_t && value ) {
     315        std::pair< iterator, bool > insertAt( size_type scope, const Key& key, value_t&& value ) {
    317316                return insertAt( scope, std::make_pair( key, std::forward<value_t>( value ) ) );
    318317        }
    319318
    320         Value & operator[] ( const Key & key ) {
     319        Value& operator[] ( const Key &key ) {
    321320                iterator slot = find( key );
    322321                if ( slot != end() ) return slot->second;
     
    325324
    326325        iterator erase( iterator pos ) {
    327                 MapType & scope = (*pos.scopes)[ pos.level ].map;
    328                 const typename iterator::wrapped_iterator & new_it = scope.erase( pos.it );
     326                MapType& scope = (*pos.scopes)[ pos.level ].map;
     327                const typename iterator::wrapped_iterator& new_it = scope.erase( pos.it );
    329328                iterator it( *pos.scopes, new_it, pos.level );
    330329                return it.next_valid();
    331330        }
    332331
    333         size_type count( const Key & key ) const {
     332        size_type count( const Key &key ) const {
    334333                size_type c = 0;
    335334                auto it = find( key );
     
    343342                return c;
    344343        }
     344
    345345};
    346346
Note: See TracChangeset for help on using the changeset viewer.