Changes in src/Common/ScopedMap.h [df00c78:6dba8755]
- File:
-
- 1 edited
-
src/Common/ScopedMap.h (modified) (24 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Common/ScopedMap.h
rdf00c78 r6dba8755 10 10 // Created On : Wed Dec 2 11:37:00 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Feb 15 08:41:28 202213 // Update Count : 512 // Last Modified On : Mon May 21 15:22:40 2018 13 // Update Count : 3 14 14 // 15 15 … … 36 36 37 37 template<typename N> 38 Scope(N && n) : map(), note(std::forward<N>(n)) {}38 Scope(N&& n) : map(), note(std::forward<N>(n)) {} 39 39 40 40 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; 45 45 }; 46 46 typedef std::vector< Scope > ScopeList; … … 58 58 typedef typename MapType::const_pointer const_pointer; 59 59 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 > { 61 62 friend class ScopedMap; 62 63 friend class const_iterator; … … 71 72 72 73 /// Increments on invalid 73 iterator & next_valid() {74 iterator& next_valid() { 74 75 if ( ! is_valid() ) { ++(*this); } 75 76 return *this; … … 77 78 78 79 /// Decrements on invalid 79 iterator & prev_valid() {80 iterator& prev_valid() { 80 81 if ( ! is_valid() ) { --(*this); } 81 82 return *this; 82 83 } 83 84 84 iterator(scope_list & _scopes, const wrapped_iterator &_it, size_type inLevel)85 iterator(scope_list &_scopes, const wrapped_iterator &_it, size_type inLevel) 85 86 : scopes(&_scopes), it(_it), level(inLevel) {} 86 87 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) { 89 90 scopes = that.scopes; level = that.level; it = that.it; 90 91 return *this; … … 94 95 pointer operator-> () const { return it.operator->(); } 95 96 96 iterator & operator++ () {97 iterator& operator++ () { 97 98 if ( it == (*scopes)[level].map.end() ) { 98 99 if ( level == 0 ) return *this; … … 106 107 iterator operator++ (int) { iterator tmp = *this; ++(*this); return tmp; } 107 108 108 iterator & operator-- () {109 iterator& operator-- () { 109 110 // may fail if this is the begin iterator; allowed by STL spec 110 111 if ( it == (*scopes)[level].map.begin() ) { … … 117 118 iterator operator-- (int) { iterator tmp = *this; --(*this); return tmp; } 118 119 119 bool operator== (const iterator & that) const {120 bool operator== (const iterator &that) const { 120 121 return scopes == that.scopes && level == that.level && it == that.it; 121 122 } 122 bool operator!= (const iterator & that) const { return !( *this == that ); }123 bool operator!= (const iterator &that) const { return !( *this == that ); } 123 124 124 125 size_type get_level() const { return level; } 125 126 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; } 128 129 129 130 private: … … 147 148 148 149 /// Increments on invalid 149 const_iterator & next_valid() {150 const_iterator& next_valid() { 150 151 if ( ! is_valid() ) { ++(*this); } 151 152 return *this; … … 153 154 154 155 /// Decrements on invalid 155 const_iterator & prev_valid() {156 const_iterator& prev_valid() { 156 157 if ( ! is_valid() ) { --(*this); } 157 158 return *this; 158 159 } 159 160 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) 161 162 : scopes(&_scopes), it(_it), level(inLevel) {} 162 163 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) { 166 167 scopes = that.scopes; level = that.level; it = that.it; 167 168 return *this; 168 169 } 169 const_iterator & operator= (const const_iterator &that) {170 const_iterator& operator= (const const_iterator &that) { 170 171 scopes = that.scopes; level = that.level; it = that.it; 171 172 return *this; … … 175 176 const_pointer operator-> () { return it.operator->(); } 176 177 177 const_iterator & operator++ () {178 const_iterator& operator++ () { 178 179 if ( it == (*scopes)[level].map.end() ) { 179 180 if ( level == 0 ) return *this; … … 187 188 const_iterator operator++ (int) { const_iterator tmp = *this; ++(*this); return tmp; } 188 189 189 const_iterator & operator-- () {190 const_iterator& operator-- () { 190 191 // may fail if this is the begin iterator; allowed by STL spec 191 192 if ( it == (*scopes)[level].map.begin() ) { … … 198 199 const_iterator operator-- (int) { const_iterator tmp = *this; --(*this); return tmp; } 199 200 200 bool operator== (const const_iterator & that) const {201 bool operator== (const const_iterator &that) const { 201 202 return scopes == that.scopes && level == that.level && it == that.it; 202 203 } 203 bool operator!= (const const_iterator & that) const { return !( *this == that ); }204 bool operator!= (const const_iterator &that) const { return !( *this == that ); } 204 205 205 206 size_type get_level() const { return level; } 206 207 207 const Note & get_note() const { return (*scopes)[level].note; }208 const Note& get_note() const { return (*scopes)[level].note; } 208 209 209 210 private: … … 220 221 // Starts a new scope with the given note 221 222 template<typename N> 222 void beginScope( N && n ) {223 void beginScope( N&& n ) { 223 224 scopes.emplace_back( std::forward<N>(n) ); 224 225 } … … 235 236 /// Constructs with a given note on the outermost scope 236 237 template<typename N> 237 ScopedMap( N && n ) : scopes() { beginScope(std::forward<N>(n)); }238 ScopedMap( N&& n ) : scopes() { beginScope(std::forward<N>(n)); } 238 239 239 240 iterator begin() { return iterator(scopes, scopes.back().map.begin(), currentScope()).next_valid(); } … … 248 249 249 250 /// 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; } 254 253 255 254 /// 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 ) { 257 256 for ( size_type i = scopes.size() - 1; ; --i ) { 258 257 typename MapType::iterator val = scopes[i].map.find( key ); … … 262 261 return end(); 263 262 } 264 const_iterator find( const Key & key ) const {263 const_iterator find( const Key &key ) const { 265 264 return const_iterator( const_cast< ScopedMap< Key, Value, Note >* >(this)->find( key ) ); 266 265 } 267 266 268 267 /// 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 ) { 270 269 typename MapType::iterator val = scopes[scope].map.find( key ); 271 270 if ( val != scopes[scope].map.end() ) return iterator( scopes, val, scope ); 272 271 return end(); 273 272 } 274 const_iterator findAt( size_type scope, const Key & key ) const {273 const_iterator findAt( size_type scope, const Key& key ) const { 275 274 return const_iterator( const_cast< ScopedMap< Key, Value, Note >* >(this)->findAt( scope, key ) ); 276 275 } 277 276 278 277 /// 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 ) { 280 279 if ( it.level == 0 ) return end(); 281 280 for ( size_type i = it.level - 1; ; --i ) { … … 286 285 return end(); 287 286 } 288 const_iterator findNext( const_iterator & it, const Key &key ) const {287 const_iterator findNext( const_iterator &it, const Key &key ) const { 289 288 return const_iterator( const_cast< ScopedMap< Key, Value, Note >* >(this)->findNext( it, key ) ); 290 289 } … … 292 291 /// Inserts the given key-value pair into the outermost scope 293 292 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 ) { 295 294 std::pair< typename MapType::iterator, bool > res = scopes.back().map.insert( std::forward<value_type_t>( value ) ); 296 295 return std::make_pair( iterator(scopes, std::move( res.first ), scopes.size()-1), std::move( res.second ) ); … … 298 297 299 298 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; 302 301 std::pair< typename MapType::iterator, bool > res = scope.insert( std::forward<value_type_t>( value ) ); 303 302 return std::make_pair( iterator(scopes, std::move( res.first ), at.level), std::move( res.second ) ); … … 305 304 306 305 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 ) ) ); } 308 307 309 308 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 ) { 311 310 std::pair< typename MapType::iterator, bool > res = scopes.at(scope).map.insert( std::forward<value_type_t>( value ) ); 312 311 return std::make_pair( iterator(scopes, std::move( res.first ), scope), std::move( res.second ) ); … … 314 313 315 314 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 ) { 317 316 return insertAt( scope, std::make_pair( key, std::forward<value_t>( value ) ) ); 318 317 } 319 318 320 Value & operator[] ( const Key &key ) {319 Value& operator[] ( const Key &key ) { 321 320 iterator slot = find( key ); 322 321 if ( slot != end() ) return slot->second; … … 325 324 326 325 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 ); 329 328 iterator it( *pos.scopes, new_it, pos.level ); 330 329 return it.next_valid(); 331 330 } 332 331 333 size_type count( const Key & key ) const {332 size_type count( const Key &key ) const { 334 333 size_type c = 0; 335 334 auto it = find( key ); … … 343 342 return c; 344 343 } 344 345 345 }; 346 346
Note:
See TracChangeset
for help on using the changeset viewer.