/******************************************************************************* * * TRIQS: a Toolbox for Research in Interacting Quantum Systems * * Copyright (C) 2011 by O. Parcollet * * TRIQS is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * TRIQS. If not, see . * ******************************************************************************/ #ifndef TRIQS_ARRAYS_ARRAY_ITERATOR_H #define TRIQS_ARRAYS_ARRAY_ITERATOR_H #include "./make_const.hpp" #include namespace triqs { namespace arrays { /** * Iterator on a couple (IndexMap, StorageType). * It transforms the mini-iterator on the IndexMap into a STL-compliant iterator. * Template parameters are : * - Const : true -> const_iterator, false -> non const version. * - IndexMapIterator : an IndexMapIterator * - StorageType : the storage. */ template class iterator_adapter : public boost::iterator_facade< iterator_adapter, typename details::make_const_type::type, boost::forward_traversal_tag > { public: typedef typename details::make_const_type::type value_type; typedef IndexMapIterator indexmap_iterator_type; iterator_adapter(): storage_(), it() {} iterator_adapter(const typename IndexMapIterator::indexmap_type & Ind, const StorageType & ST, bool atEnd=false): storage_(ST), it(Ind,atEnd) {} operator bool() const { return bool(it);} typename IndexMapIterator::indexmap_type::domain_type::index_value_type const & indices() const {return it.indices();} IndexMapIterator const & indexmap_iterator() const { return it;} private: friend class boost::iterator_core_access; void increment() { ++it; } value_type & dereference() const { return storage_[*it];} bool equal(iterator_adapter const & other) const { return (other.it == it);} StorageType storage_; IndexMapIterator it; }; }}//namespace triqs::arrays #endif