| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | [library Boost.Iterator | 
					
						
							|  |  |  |     [/ version 1.0.1] | 
					
						
							| 
									
										
										
										
											2015-08-24 12:49:59 -04:00
										 |  |  |     [quickbook 1.6] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  |     [authors [Abrahams, David], [Siek, Jeremy], [Witt, Thomas]] | 
					
						
							|  |  |  |     [copyright 2003 2005 David Abrahams Jeremy Siek Thomas Witt] | 
					
						
							|  |  |  |     [category iterator] | 
					
						
							|  |  |  |     [id iterator] | 
					
						
							|  |  |  |     [dirname iterator] | 
					
						
							|  |  |  |     [purpose | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     [license | 
					
						
							|  |  |  |         Distributed under the Boost Software License, Version 1.0. | 
					
						
							|  |  |  |         (See accompanying file LICENSE_1_0.txt or copy at | 
					
						
							|  |  |  |         <ulink url="http://www.boost.org/LICENSE_1_0.txt"> | 
					
						
							|  |  |  |             http://www.boost.org/LICENSE_1_0.txt | 
					
						
							|  |  |  |         </ulink>) | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [/ QuickBook Document version 1.0 ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [/  Images   ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [def _note_               [$images/note.png]] | 
					
						
							|  |  |  | [def _alert_              [$images/caution.png]] | 
					
						
							|  |  |  | [def _detail_             [$images/note.png]] | 
					
						
							|  |  |  | [def _tip_                [$images/tip.png]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [/  Links   ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [def _iterator_           [@../../../iterator/doc/index.html Boost.Iterator]] | 
					
						
							|  |  |  | [def _concept_check_      [@../../../concept_check/index.html Boost.ConceptCheck]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [template sub[x]'''<subscript>'''[x]'''</subscript>'''] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | [section:intro Introduction] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-10 16:39:38 +00:00
										 |  |  | [def _concepts_ [@http://www.boost.org/more/generic_programming.html#concept concepts]] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | The Boost Iterator Library contains two parts. The first | 
					
						
							|  |  |  | is a system of _concepts_ which extend the C++ standard | 
					
						
							|  |  |  | iterator requirements. The second is a framework of | 
					
						
							|  |  |  | components for building iterators based on these | 
					
						
							|  |  |  | extended concepts and includes several useful iterator | 
					
						
							|  |  |  | adaptors. The extended iterator concepts have been | 
					
						
							|  |  |  | carefully designed so that old-style iterators | 
					
						
							|  |  |  | can fit in the new concepts and so that new-style | 
					
						
							|  |  |  | iterators will be compatible with old-style algorithms, | 
					
						
							|  |  |  | though algorithms may need to be updated if they want to | 
					
						
							|  |  |  | take full advantage of the new-style iterator | 
					
						
							|  |  |  | capabilities.  Several components of this library have | 
					
						
							|  |  |  | been accepted into the C++ standard technical report. | 
					
						
							|  |  |  | The components of the Boost Iterator Library replace the | 
					
						
							|  |  |  | older Boost Iterator Adaptor Library. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [h2 New-Style Iterators] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [def _N1185_      [@http://www.gotw.ca/publications/N1185.pdf N1185]] | 
					
						
							|  |  |  | [def _N1211_      [@http://www.gotw.ca/publications/N1211.pdf N1211]] | 
					
						
							|  |  |  | [def _GOTW_50_    [@http://www.gotw.ca/gotw/050.htm Guru of the Week]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The iterator categories defined in C++98 are extremely limiting | 
					
						
							|  |  |  | because they bind together two orthogonal concepts: traversal and | 
					
						
							|  |  |  | element access.  For example, because a random access iterator is | 
					
						
							|  |  |  | required to return a reference (and not a proxy) when dereferenced, | 
					
						
							|  |  |  | it is impossible to capture the capabilities of | 
					
						
							|  |  |  | `vector<bool>::iterator` using the C++98 categories.  This is the | 
					
						
							|  |  |  | infamous "`vector<bool>` is not a container, and its iterators | 
					
						
							|  |  |  | aren't random access iterators", debacle about which Herb Sutter | 
					
						
							|  |  |  | wrote two papers for the standards comittee (_N1185_ and _N1211_), | 
					
						
							|  |  |  | and a _GOTW_50_.  New-style iterators go well beyond | 
					
						
							|  |  |  | patching up `vector<bool>`, though: there are lots of other | 
					
						
							|  |  |  | iterators already in use which can't be adequately represented by | 
					
						
							|  |  |  | the existing concepts.  For details about the new iterator | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | concepts, see our [@../new-iter-concepts.html Standard Proposal for New-Style Iterators]. | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | [h2 Iterator Facade and Adaptor] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [/ | 
					
						
							|  |  |  | [def _facade_ [link iterator.generic.facade facade]] | 
					
						
							|  |  |  | [def _adaptor_ [link iterator.generic.adaptor adaptor]] | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | [def _facade_ [@../iterator_facade.html facade]] | 
					
						
							|  |  |  | [def _adaptor_ [@../iterator_adaptor.html adaptor]] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | Writing standard-conforming iterators is tricky, but the need comes | 
					
						
							|  |  |  | up often.  In order to ease the implementation of new iterators, | 
					
						
							|  |  |  | the Boost.Iterator library provides the _facade_ class template, | 
					
						
							|  |  |  | which implements many useful defaults and compile-time checks | 
					
						
							|  |  |  | designed to help the iterator author ensure that his iterator is | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | correct. | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | It is also common to define a new iterator that is similar to some | 
					
						
							|  |  |  | underlying iterator or iterator-like type, but that modifies some | 
					
						
							|  |  |  | aspect of the underlying type's behavior.  For that purpose, the | 
					
						
							|  |  |  | library supplies the _adaptor_ class template, which is specially | 
					
						
							|  |  |  | designed to take advantage of as much of the underlying type's | 
					
						
							|  |  |  | behavior as possible. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | Both _facade_ and _adaptor_ as well as many of the [link iterator.specialized specialized | 
					
						
							|  |  |  | adaptors] mentioned below have been proposed for standardization | 
					
						
							|  |  |  | ([@../facade-and-adaptor.html Standard Proposal For Iterator Facade and Adaptor]). | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | [h2 Specialized Adaptors] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The iterator library supplies a useful suite of standard-conforming | 
					
						
							|  |  |  | iterator templates based on the Boost [link | 
					
						
							| 
									
										
										
										
											2015-08-24 12:49:59 -04:00
										 |  |  | iterator.intro.iterator_facade_and_adaptor iterator facade and adaptor] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | templates. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [def _counting_    [link iterator.specialized.counting `counting_iterator`]] | 
					
						
							|  |  |  | [def _filter_      [link iterator.specialized.filter `filter_iterator`]] | 
					
						
							|  |  |  | [def _function_    [link iterator.specialized.function_output `function_output_iterator`]] | 
					
						
							|  |  |  | [def _indirect_    [link iterator.specialized.indirect `indirect_iterator`]] | 
					
						
							|  |  |  | [def _permutation_ [link iterator.specialized.permutation `permutation_iterator`]] | 
					
						
							|  |  |  | [def _reverse_     [link iterator.specialized.reverse `reverse_iterator`]] | 
					
						
							|  |  |  | [def _shared_      [link iterator.specialized.shared_container `shared_container_iterator`]] | 
					
						
							|  |  |  | [def _transform_   [link iterator.specialized.transform `transform_iterator`]] | 
					
						
							|  |  |  | [def _zip_         [link iterator.specialized.zip `zip_iterator`]] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | [def _shared_ptr_  [@../../smart_ptr/shared_ptr.htm `shared_ptr`]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _counting_: an iterator over a sequence of consecutive values. | 
					
						
							|  |  |  |   Implements a "lazy sequence" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _filter_: an iterator over the subset of elements of some | 
					
						
							|  |  |  |   sequence which satisfy a given predicate | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _function_: an output iterator wrapping a unary function | 
					
						
							|  |  |  |   object; each time an element is written into the dereferenced | 
					
						
							|  |  |  |   iterator, it is passed as a parameter to the function object. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _indirect_: an iterator over the objects *pointed-to* by the | 
					
						
							|  |  |  |   elements of some sequence. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _permutation_: an iterator over the elements of some random-access | 
					
						
							|  |  |  |   sequence, rearranged according to some sequence of integer indices. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _reverse_: an iterator which traverses the elements of some | 
					
						
							|  |  |  |   bidirectional sequence in reverse.  Corrects many of the | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  |   shortcomings of C++98's `std::reverse_iterator`. | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | * _shared_: an iterator over elements of a container whose | 
					
						
							|  |  |  |   lifetime is maintained by a _shared_ptr_ stored in the iterator. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _transform_: an iterator over elements which are the result of | 
					
						
							|  |  |  |   applying some functional transformation to the elements of an | 
					
						
							|  |  |  |   underlying sequence.  This component also replaces the old | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  |   `projection_iterator_adaptor`. | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | * _zip_: an iterator over tuples of the elements at corresponding | 
					
						
							|  |  |  |   positions of heterogeneous underlying iterators. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [h2 Iterator Utilities] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [h3 Traits] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [def _pointee_          [link iterator.utilities.traits `pointee.hpp`]] | 
					
						
							|  |  |  | [def _iterator_traits_  [link iterator.utilities.iterator_traits `iterator_traits.hpp`]] | 
					
						
							|  |  |  | [def _interoperable_    [@../interoperable.html   `interoperable.hpp`]] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | [def _MPL_              [@../../mpl/doc/index.html   [*MPL]]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _pointee_: Provides the capability to deduce the referent types | 
					
						
							|  |  |  |   of pointers, smart pointers and iterators in generic code.  Used | 
					
						
							|  |  |  |   in _indirect_. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _iterator_traits_: Provides _MPL_ compatible metafunctions which | 
					
						
							|  |  |  |   retrieve an iterator's traits.  Also corrects for the deficiencies | 
					
						
							|  |  |  |   of broken implementations of `std::iterator_traits`. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [/ | 
					
						
							|  |  |  | * _interoperable_: Provides an _MPL_ compatible metafunction for | 
					
						
							|  |  |  |   testing iterator interoperability | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [h3 Testing and Concept Checking] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [def _iterator_concepts_  [link iterator.concepts `iterator_concepts.hpp`]] | 
					
						
							|  |  |  | [def _iterator_archetypes_  [link iterator.utilities.archetypes `iterator_archetypes.hpp`]] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | * _iterator_concepts_: Concept checking classes for the new iterator concepts. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _iterator_archetypes_: Concept archetype classes for the new iterators concepts. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 16:27:55 +03:00
										 |  |  | [h2 Iterator Algorithms] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The library provides a number of generic algorithms for use with iterators. These | 
					
						
							|  |  |  | algorithms take advantage of the new concepts defined by the library to provide | 
					
						
							|  |  |  | better performance and functionality. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [def _advance_          [link iterator.algorithms.advance `advance.hpp`]] | 
					
						
							|  |  |  | [def _distance_         [link iterator.algorithms.distance `distance.hpp`]] | 
					
						
							| 
									
										
										
										
											2017-08-26 16:27:55 +03:00
										 |  |  | [def _next_prior_       [link iterator.algorithms.next_prior `next_prior.hpp`]] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | * _advance_: Provides `advance()` function for advancing an iterator a given number | 
					
						
							|  |  |  |   of positions forward or backward. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * _distance_: Provides `distance()` function for computing distance between two | 
					
						
							|  |  |  |   iterators. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 16:27:55 +03:00
										 |  |  | * _next_prior_: Provides `next()` and `prior()` functions for obtaining | 
					
						
							|  |  |  |   next and prior iterators to a given iterator. The functions are also compatible | 
					
						
							|  |  |  |   with non-iterator types. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | [endsect] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [include concepts.qbk] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [section:generic Generic Iterators] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [include facade.qbk] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [include adaptor.qbk] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [endsect] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [include specialized_adaptors.qbk] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [section:utilities Utilities] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [include archetypes.qbk] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [include concept_checking.qbk] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [include iterator_traits.qbk] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 19:56:23 +03:00
										 |  |  | [include type_traits.qbk] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | [endsect] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-26 16:27:55 +03:00
										 |  |  | [include algorithms.qbk] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | [section:upgrading Upgrading from the old Boost Iterator Adaptor Library] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-02-10 16:39:38 +00:00
										 |  |  | [def _type_generator_ [@http://www.boost.org/more/generic_programming.html#type_generator type generator]] | 
					
						
							| 
									
										
										
										
											2005-09-13 22:42:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | If you have been using the old Boost Iterator Adaptor library to | 
					
						
							|  |  |  | implement iterators, you probably wrote a `Policies` class which | 
					
						
							|  |  |  | captures the core operations of your iterator.  In the new library | 
					
						
							|  |  |  | design, you'll move those same core operations into the body of the | 
					
						
							|  |  |  | iterator class itself.  If you were writing a family of iterators, | 
					
						
							|  |  |  | you probably wrote a _type_generator_ to build the | 
					
						
							|  |  |  | `iterator_adaptor` specialization you needed; in the new library | 
					
						
							|  |  |  | design you don't need a type generator (though may want to keep it | 
					
						
							|  |  |  | around as a compatibility aid for older code) because, due to the | 
					
						
							|  |  |  | use of the Curiously Recurring Template Pattern (CRTP) [Cop95]_, | 
					
						
							|  |  |  | you can now define the iterator class yourself and acquire | 
					
						
							|  |  |  | functionality through inheritance from `iterator_facade` or | 
					
						
							|  |  |  | `iterator_adaptor`.  As a result, you also get much finer control | 
					
						
							|  |  |  | over how your iterator works: you can add additional constructors, | 
					
						
							|  |  |  | or even override the iterator functionality provided by the | 
					
						
							|  |  |  | library. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If you're looking for the old `projection_iterator` component, | 
					
						
							|  |  |  | its functionality has been merged into _transform_iterator_: as | 
					
						
							|  |  |  | long as the function object's `result_type` (or the `Reference` | 
					
						
							|  |  |  | template argument, if explicitly specified) is a true reference | 
					
						
							|  |  |  | type, _transform_iterator_ will behave like | 
					
						
							|  |  |  | `projection_iterator` used to. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [endsect] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [section:history History] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In 2000 Dave Abrahams was writing an iterator for a container of | 
					
						
							|  |  |  | pointers, which would access the pointed-to elements when | 
					
						
							|  |  |  | dereferenced.  Naturally, being a library writer, he decided to | 
					
						
							|  |  |  | generalize the idea and the Boost Iterator Adaptor library was born. | 
					
						
							|  |  |  | Dave was inspired by some writings of Andrei Alexandrescu and chose a | 
					
						
							|  |  |  | policy based design (though he probably didn't capture Andrei's idea | 
					
						
							|  |  |  | very well - there was only one policy class for all the iterator's | 
					
						
							|  |  |  | orthogonal properties).  Soon Jeremy Siek realized he would need the | 
					
						
							|  |  |  | library and they worked together to produce a "Boostified" version, | 
					
						
							|  |  |  | which was reviewed and accepted into the library.  They wrote a paper | 
					
						
							|  |  |  | and made several important revisions of the code. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Eventually, several shortcomings of the older library began to make | 
					
						
							|  |  |  | the need for a rewrite apparent.  Dave and Jeremy started working | 
					
						
							|  |  |  | at the Santa Cruz C++ committee meeting in 2002, and had quickly | 
					
						
							|  |  |  | generated a working prototype.  At the urging of Mat Marcus, they | 
					
						
							|  |  |  | decided to use the GenVoca/CRTP pattern approach, and moved the | 
					
						
							|  |  |  | policies into the iterator class itself.  Thomas Witt expressed | 
					
						
							|  |  |  | interest and became the voice of strict compile-time checking for | 
					
						
							|  |  |  | the project, adding uses of the SFINAE technique to eliminate false | 
					
						
							|  |  |  | converting constructors and operators from the overload set.  He | 
					
						
							|  |  |  | also recognized the need for a separate `iterator_facade`, and | 
					
						
							|  |  |  | factored it out of `iterator_adaptor`.  Finally, after a | 
					
						
							|  |  |  | near-complete rewrite of the prototype, they came up with the | 
					
						
							|  |  |  | library you see today. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [:\[Coplien, 1995\] Coplien, J., Curiously Recurring Template | 
					
						
							|  |  |  |    Patterns, C++ Report, February 1995, pp. 24-27.] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | [endsect] | 
					
						
							|  |  |  | 
 |