Boost logo

Boost :

From: Pavol Droba (droba_at_[hidden])
Date: 2003-10-21 15:22:23


Hi,

Following the complaints about some missing information about the string_algo
library, pointed out by Beman, I'd like to explain here in more detail the
concepts used in the library.

InputContainerConcepts
----------------------

Unlike the STL algorithm library, which is iterator-oriented, string_algo library
has adopted a Container as a basic concept used for arguments.

However, STL specification of a container if too strong. On many places, a simplified
version of the Container concept is sufficient.
We use the name InputContainer for it.

Definition:

InputContainerConcept:
{

/////// types

         typedef ... value_type;
         typedef ... size_type;
         typedef ... iterator;
         typedef ... const_iterator;
         typedef ... difference_type;

////// operations

         iterator begin();
         const_iterator begin() const;
         iterator end();
         const_iterator end() const;
         
          size_type size();
         bool empty();
};

These properties are exactly the properties the STD Container concept,
except of construction/destuction method, and swap.

This concept allows to access the values contained in the container, without altering
the state of the container itself. It means, the it is not possible to change,
what elemnts are containd by this container.
It is sufficient for those arguments in algorithms with are not altered (i.e. immutable arguments)

container_traits, one of the core facilities defined in theis library, wraps this concept,
and allows to access some of legacy C structure (C-arrays and string) using this interface.

iterator_range also implements this concept for a pair of iterators.

In the string_algo library, a container satifying this concept can be used as any non-result
argument (i.e. the argument, whose type is not used as a result).

Algorithm variants
------------------

All trasformation algorithms in the library comes in three variants. Two "copy" variants
and one inplace, mutating the input.

1. The inplace variant uses the input as a result. In general, the algorithms require,
   that this type satisfies the SequenceConcept (Std 23.2). Operations like insert, erase
        are required.

2. Copy variant, that returns the copy of the modyfied input. This variant also uses the same type
   as input for the result. For all algorithms, SeqeuenceConcept is sufficient, however for some
   of them, standard ContainerConcept (Std 23.1) is sufficient. In addition to InputContainer,
   there is a need for a construction, because the new copy of the container is required.

        It has been proposed during this review by Pavel Vozenilek to use sequence trait (another facility for this
   library) to optimize behaviour of this variant. Now it seems possible, that this would
        also allow, to ease the requierements on the input type and use the additional feature, only when
        they will be available.

3. Copy variant, that copies to output to an output iterator. This variant has the least requirements.
        Because, the input type is not used for the result, the input need to only satisfy InputContainer
   requirements. This variant has the same level of generality as algorithms in STL.

Pavol


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk