diff --git a/indirect_iterator.htm b/indirect_iterator.htm index 13ac379..ba4933c 100644 --- a/indirect_iterator.htm +++ b/indirect_iterator.htm @@ -1,44 +1,44 @@ - + -
- - - --The indirect iterator adaptor augments an iterator by applying an -extra dereference inside of operator*(). For example, -this iterator makes it possible to view containers of pointers such as -std::list<foo*> as if there were containers of the -pointed-to type (in this case std::list<foo>). The -following pseudo-code shows the basic idea of the indirect -iterator: +
The indirect iterator adaptor augments an iterator by applying an + extra dereference inside of operator*(). For example, this + iterator makes it possible to view a container of pointers or + smart-pointers (e.g. std::list<boost::shared_ptr<foo> + >) as if it were a container of the pointed-to type. The following + pseudo-code shows the basic idea of the indirect iterator: +
+- // inside a hypothetical indirect_iterator class... - typedef std::iterator_traits<BaseIterator>::value_type Pointer; - typedef std::iterator_traits<Pointer>::reference reference; +// inside a hypothetical indirect_iterator class... +typedef std::iterator_traits<BaseIterator>::value_type Pointer; +typedef std::iterator_traits<Pointer>::reference reference; - reference indirect_iterator::operator*() const { - return **this->base_iterator; - } +reference indirect_iterator::operator*() const { + return **this->base_iterator; +}+
+namespace boost { template <class BaseIterator, @@ -46,7 +46,7 @@ namespace boost { struct indirect_iterator_generator; template <class BaseIterator, - class Value, class Pointer, class Reference, + class Value, class Pointer, class Reference, class ConstPointer, class ConstReference> struct indirect_iterator_pair_generator; @@ -55,38 +55,41 @@ namespace boost { make_indirect_iterator(BaseIterator base) }+
-template <class BaseIterator, class Value, class Reference, class Pointer> class indirect_iterator_generator { public: - typedef iterator_adaptor<...> type; // the resulting indirect iterator type + typedef iterator_adaptor<...> type; // the resulting indirect iterator type };+
-#include <boost/config.hpp> #include <vector> @@ -100,7 +103,7 @@ int main(int, char*[]) const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char char* pointers_to_chars[N]; // at the end. for (int i = 0; i < N; ++i) - pointers_to_chars[i] = &characters[i]; + pointers_to_chars[i] = &characters[i]; boost::indirect_iterator_generator<char**, char>::type indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N); @@ -110,77 +113,82 @@ int main(int, char*[]) // to be continued...+
Parameter | Description | -
---|
Parameter - | ||
---|---|---|
BaseIterator | -The iterator type being wrapped. The value type of the base iterator -should be a pointer (a Trivial -Iterator). | - -Description - |
Value | -The value-type of the value-type of the base iterator. That is, the
-type of object that is accessed by dereferences in the base iterator twice. -Default: -std::iterator_traits<std::iterator_traits<BaseIterator>::value_type>::value_type - |
+ |
BaseIterator - | ||
Reference | -The corresponding reference type for the Value. -Default: Value& |
-
+ The iterator type being wrapped. The value_type of the + base iterator should itself be dereferenceable (a Trivial Iterator). - |
Pointer | -The corresponding pointer type for the Value. -Default: Value* |
-
+ |
Value - |
indirect_iterator_generator::type(const BaseIterator& it)+
-
+
-
-template <class BaseIterator, class Value, class Pointer, class Reference, @@ -188,23 +196,27 @@ template <class BaseIterator, class indirect_iterator_pair_generator { public: - typedef iterator_adaptor<...> iterator; // the mutable indirect iterator type - typedef iterator_adaptor<...> const_iterator; // the immutable indirect iterator type + typedef iterator_adaptor<...> iterator; // the mutable indirect iterator type + typedef iterator_adaptor<...> const_iterator; // the immutable indirect iterator type };+
+ +// continuing from the last example... - typedef boost::indirect_iterator_pair_generator-The output is: +PairGen; + typedef boost::indirect_iterator_pair_generator<char**, + char, char*, char&, const char*, const char&> PairGen; char mutable_characters[N]; char* pointers_to_mutable_chars[N]; - for (int i = 0; i < N; ++i) - pointers_to_mutable_chars[i] = &mutable_characters[i]; + for (int i = 0; i < N; ++i) + pointers_to_mutable_chars[i] = &mutable_characters[i]; PairGen::iterator mutable_indirect_first(pointers_to_mutable_chars), mutable_indirect_last(pointers_to_mutable_chars + N); @@ -212,148 +224,174 @@ public: const_indirect_last(pointers_to_chars + N); std::transform(const_indirect_first, const_indirect_last, - mutable_indirect_first, std::bind1st(std::plus (), 1)); + mutable_indirect_first, std::bind1st(std::plus<char>(), 1)); std::copy(mutable_indirect_first, mutable_indirect_last, - std::ostream_iterator (std::cout, ",")); - std::cout << std::endl; + std::ostream_iterator<char>(std::cout, ",")); + std::cout << std::endl; // to be continued...
The output is: + +
-b,c,d,e,f,g,h,+
Parameter | Description | -
---|
Parameter - | ||
---|---|---|
BaseIterator | -The iterator type being wrapped. The value type of the base iterator -should be a pointer (a Trivial -Iterator). | - -Description - |
Value | -The value-type of the value-type of the base iterator. That is, the
-type of object that is accessed by dereferences in the base iterator twice. -Default: -std::iterator_traits<std::iterator_traits<BaseIterator>::value_type>::value_type - |
+ |
BaseIterator - | ||
Reference | -The corresponding reference type for the Value. -Default: Value& |
-
+ The iterator type being wrapped. The value_type of the + base iterator should itself be dereferenceable (a Trivial Iterator). - |
Pointer | -The corresponding pointer type for the Value. -Default: Value* |
-
+ |
Value - | ||
ConstReference | -The corresponding const reference type for the Value. -Default: const Value& |
-
+ The value_type of the resulting iterators + Default: std::iterator_traits< + std::iterator_traits<BaseIterator>::value_type + >::value_type[2] - |
ConstPointer | -The corresponding const pointer type for the Value. -Default: const Value* |
-
+ |
Reference - |
+indirect_iterator_pair_generator::iterator(const BaseIterator& it) -- -indirect_iterator_pair_generator::const_iterator(const BaseIterator& it)+
-
+
-
+- template <class BaseIterator> - typename indirect_iterator_generator<BaseIterator>::type - make_indirect_iterator(BaseIterator base) +template <class BaseIterator> +typename indirect_iterator_generator<BaseIterator>::type +make_indirect_iterator(BaseIterator base)+
+ The output is: + +// continuing from the last example... std::copy(boost::make_indirect_iterator(pointers_to_chars), - boost::make_indirect_iterator(pointers_to_chars + N), - std::ostream_iterator-The output is: +(std::cout, ",")); - std::cout << std::endl; + boost::make_indirect_iterator(pointers_to_chars + N), + std::ostream_iterator<char>(std::cout, ",")); + std::cout << std::endl; return 0; }
+a,b,c,d,e,f,g,+
Revised 10 Feb 2001
-© Copyright Jeremy Siek 2000. Permission to copy, use, -modify, sell and distribute this document is granted provided this copyright -notice appears in all copies. This document is provided "as is" -without express or implied warranty, and with no claim as to its suitability for -any purpose.
+- - - - +
[2] If your compiler does not support partial + specialization and the base iterator or its value_type is a + builtin pointer type, you will not be able to use the default for + Value and will need to specify this type explicitly. +
Revised + 10 + Feb 2001 + + +
© Copyright Jeremy Siek and David Abrahams 2001. Permission to + copy, use, modify, sell and distribute this document is granted provided + this copyright notice appears in all copies. This document is provided "as + is" without express or implied warranty, and with no claim as to its + suitability for any purpose. + + + + + + +