Home | History | Annotate | Download | only in shill
      1 //
      2 // Copyright (C) 2012 The Android Open Source Project
      3 //
      4 // Licensed under the Apache License, Version 2.0 (the "License");
      5 // you may not use this file except in compliance with the License.
      6 // You may obtain a copy of the License at
      7 //
      8 //      http://www.apache.org/licenses/LICENSE-2.0
      9 //
     10 // Unless required by applicable law or agreed to in writing, software
     11 // distributed under the License is distributed on an "AS IS" BASIS,
     12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 // See the License for the specific language governing permissions and
     14 // limitations under the License.
     15 //
     16 
     17 #ifndef SHILL_PROPERTY_ITERATOR_H_
     18 #define SHILL_PROPERTY_ITERATOR_H_
     19 
     20 #include <map>
     21 #include <string>
     22 
     23 #include "shill/accessor_interface.h"
     24 #include "shill/error.h"
     25 
     26 namespace shill {
     27 
     28 // An iterator wrapper class to hide the details of what kind of data structure
     29 // we're using to store key/value pairs for properties. It is intended for use
     30 // with PropertyStore and always advances to the next readable property.
     31 template <class V>
     32 class ReadablePropertyConstIterator {
     33  public:
     34   ~ReadablePropertyConstIterator() {}
     35 
     36   bool AtEnd() const { return it_ == collection_.end(); }
     37 
     38   void Advance() {
     39     if (!AtEnd()) {
     40       do {
     41         ++it_;
     42       } while (MustAdvance());
     43     }
     44   }
     45 
     46   const std::string& Key() const { return it_->first; }
     47 
     48   const V& value() const { return value_; }
     49 
     50  private:
     51   friend class PropertyStore;
     52 
     53   typedef std::shared_ptr<AccessorInterface<V>> VAccessorPtr;
     54 
     55   explicit ReadablePropertyConstIterator(
     56       const typename std::map<std::string, VAccessorPtr>& collection)
     57       : collection_(collection),
     58         it_(collection_.begin()),
     59         value_() {
     60     if (MustAdvance()) {
     61       Advance();
     62     }
     63   }
     64 
     65   bool MustAdvance() { return !AtEnd() && !RetrieveCurrentValue(); }
     66 
     67   bool RetrieveCurrentValue() {
     68     Error error;
     69     value_ = it_->second->Get(&error);
     70     return error.IsSuccess();
     71   }
     72 
     73   const typename std::map<std::string, VAccessorPtr>& collection_;
     74   typename std::map<std::string, VAccessorPtr>::const_iterator it_;
     75   V value_;
     76 };
     77 
     78 }  // namespace shill
     79 
     80 #endif  // SHILL_PROPERTY_ITERATOR_H_
     81