/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 ARY_STORE_S_ITERATOR_HXX #define ARY_STORE_S_ITERATOR_HXX // USED SERVICES #include #include "s_base.hxx" namespace ary { namespace stg { template class const_iterator; template class const_filter_iterator; /** A non-const iterator that runs on a ->Storage<>. @collab Storage<> */ template class iterator : public std::iterator { public: typedef iterator self; typedef typename Base::impl_type impl_container; typedef typename impl_container::const_iterator impl_type; // OPERATORS iterator() : itImpl() {} explicit iterator( impl_type i_impl) : itImpl(i_impl) {} ~iterator() {} bool operator==( self i_other ) const { return itImpl == i_other.itImpl; } bool operator!=( self i_other ) const { return itImpl != i_other.itImpl; } ENTITY & operator*() const { csv_assert(*itImpl != 0); return *(*itImpl); } self & operator++() { ++itImpl; return *this; } self operator++(int) { return self(itImpl++); } private: friend class const_iterator; // For const_iterator(iterator); impl_type ImplIterator() const { return itImpl; } // DATA impl_type itImpl; }; /** A const iterator that runs on a ->Storage<>. @collab Storage<> */ template class const_iterator : public std::iterator { public: typedef const_iterator self; typedef typename Base::impl_type impl_container; typedef typename impl_container::const_iterator impl_type; // OPERATORS const_iterator() : itImpl() {} explicit const_iterator( impl_type i_impl) : itImpl(i_impl) {} const_iterator( // implicit conversions allowed ::ary::stg::iterator i_it ) : itImpl(i_it.ImplIterator()) {} ~const_iterator() {} bool operator==( self i_other ) const { return itImpl == i_other.itImpl; } bool operator!=( self i_other ) const { return itImpl != i_other.itImpl; } const ENTITY & operator*() const { csv_assert(*itImpl != 0); return *(*itImpl); } self & operator++() { ++itImpl; return *this; } self operator++(int) { return self(itImpl++); } private: // DATA impl_type itImpl; }; /** A non const iterator that runs on a ->Storage<> and returns only the elements of a specific type. @tpl ENTITY The element type of the ->Storage<> @tpl FILTER The actual type of the returned items. FILTER needs to be derived from ENTITY. @collab Storage<> */ template class filter_iterator : public std::iterator { public: typedef filter_iterator self; typedef ::ary::stg::iterator impl_type; // OPERATORS filter_iterator() : itCur() {} explicit filter_iterator( impl_type i_cur ) : itCur(i_cur) {} ~filter_iterator() {} bool operator==( self i_other ) const { return itCur == i_other.itCur; } bool operator!=( self i_other ) const { return itCur != i_other.itCur; } FILTER & operator*() const { csv_assert(IsValid()); return static_cast< FILTER& >(*itCur); } self & operator++() { ++itCur; return *this; } self operator++(int) { return self(itCur++); } bool IsValid() const { return ary::is_type(*itCur); } private: friend class const_filter_iterator; // For const_filter_iterator(filter_iterator); impl_type ImplCur() const { return itCur; } // DATA impl_type itCur; }; /** A const iterator that runs on a ->Storage<> and returns only the elements of a specific type. @tpl ENTITY The element type of the ->Storage<> @tpl FILTER The actual type of the returned items. FILTER needs to be derived from ENTITY. @collab Storage<> */ template class const_filter_iterator : public std::iterator { public: typedef const_filter_iterator self; typedef ::ary::stg::const_iterator impl_type; // OPERATORS const_filter_iterator() : itCur() {} explicit const_filter_iterator( impl_type i_cur ) : itCur(i_cur) {} explicit const_filter_iterator( // implicit conversions allowed filter_iterator i_it ) : itCur(i_it.ImplCur()) {} ~const_filter_iterator() {} bool operator==( self i_other ) const { return itCur == i_other.itCur; } bool operator!=( self i_other ) const { return itCur != i_other.itCur; } const FILTER & operator*() const { csv_assert(IsValid()); return static_cast< const FILTER& >(*itCur); } self & operator++() { ++itCur; return *this; } self operator++(int) { return self(itCur++); } bool IsValid() const { return ary::is_type(*itCur); } private: // DATA impl_type itCur; }; } // namespace stg } // namespace ary #endif