// // Copyright (C) 2012 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #ifndef SHILL_PROPERTY_ITERATOR_H_ #define SHILL_PROPERTY_ITERATOR_H_ #include <map> #include <string> #include "shill/accessor_interface.h" #include "shill/error.h" namespace shill { // An iterator wrapper class to hide the details of what kind of data structure // we're using to store key/value pairs for properties. It is intended for use // with PropertyStore and always advances to the next readable property. template <class V> class ReadablePropertyConstIterator { public: ~ReadablePropertyConstIterator() {} bool AtEnd() const { return it_ == collection_.end(); } void Advance() { if (!AtEnd()) { do { ++it_; } while (MustAdvance()); } } const std::string& Key() const { return it_->first; } const V& value() const { return value_; } private: friend class PropertyStore; typedef std::shared_ptr<AccessorInterface<V>> VAccessorPtr; explicit ReadablePropertyConstIterator( const typename std::map<std::string, VAccessorPtr>& collection) : collection_(collection), it_(collection_.begin()), value_() { if (MustAdvance()) { Advance(); } } bool MustAdvance() { return !AtEnd() && !RetrieveCurrentValue(); } bool RetrieveCurrentValue() { Error error; value_ = it_->second->Get(&error); return error.IsSuccess(); } const typename std::map<std::string, VAccessorPtr>& collection_; typename std::map<std::string, VAccessorPtr>::const_iterator it_; V value_; }; } // namespace shill #endif // SHILL_PROPERTY_ITERATOR_H_