| [/ |
| Copyright (c) 2008-2009 Joachim Faulhaber |
| |
| Distributed under the Boost Software License, Version 1.0. |
| (See accompanying file LICENSE_1_0.txt or copy at |
| http://www.boost.org/LICENSE_1_0.txt) |
| ] |
| |
| |
| [/ //= Addition ===============================================================] |
| [section Addition] |
| |
| [section Synopsis] |
| |
| [table |
| |
| [[Addition] [__ch_itv_sets__][__ch_itv_maps__][__ch_ele_sets__][__ch_ele_maps__] ] |
| |
| [[`T& T::add(const P&)`] [__ei] [__bp] [ ] [__b] ] |
| [[`T& add(T&, const P&)`] [__ei] [__bp] [__e] [__b] ] |
| [[`J T::add(J pos, const P&)`] [__i] [__p] [ ] [__b] ] |
| [[`J add(T&, J pos, const P&)`] [__i] [__p] [__e] [__b] ] |
| |
| [[`T& operator +=(T&, const P&)`] [__eiS] [__bpM] [__es] [__bm] ] |
| [[`T operator + (T, const P&)`\n |
| `T operator + (const P&, T)`] |
| [__eiS] [__bpM] [__es] [__bm] ] |
| [[`T& operator |=( T&, const P&)`] [__eiS] [__bpM] [__es] [__bm] ] |
| [[`T operator | (T, const P&)`\n |
| `T operator | (const P&, T)`] |
| [__eiS] [__bpM] [__es] [__bm] ] |
| |
| ] |
| |
| Functions and operators that implement ['*Addition*] on *icl* objects |
| are given in the table above. |
| `operator |=` and `operator |` are behavioral identical to |
| `operator +=` and `operator +`. |
| This is a redundancy that has been introduced deliberately, because |
| a /set union/ semantics is often attached `operators |=` and `|`. |
| |
| [table |
| [[] [Description of Addition]] |
| [[`Sets`][Addition on Sets implements ['*set union*]]] |
| [[`Maps`][Addition on Maps implements a ['*map union*] function similar to /set union/. |
| If, on insertion of an element value pair `(k,v)` it's key `k` is in the map |
| already, the addition function is propagated to the associated value. |
| This functionality has been introduced as /aggregate on collision/ |
| for element maps and /aggregate on overlap/ for interval maps. |
| |
| Find more on |
| [link boost_icl.concepts.aggrovering ['addability of maps]] |
| and related |
| [link boost_icl.semantics.maps ['semantic issues]] |
| following the links. |
| |
| Examples, demonstrating Addition on interval containers are |
| [link boost_icl.examples.overlap_counter ['overlap counter]], |
| [link boost_icl.examples.party ['party]] and |
| [link boost_icl.examples.partys_height_average ['party's height average.]] |
| ]] |
| ] |
| |
| For `Sets` ['*addition*] and ['*insertion*] are implemented identically. |
| Functions `add` and `insert` collapse to the same function. |
| For `Maps` ['*addition*] and ['*insertion*] work differently. |
| Function `add` performs aggregations on collision or overlap, |
| while function `insert` only inserts values that do not yet have key values. |
| |
| [endsect][/ Synopsis] |
| |
| [section Functions][/ Addition] |
| |
| The admissible combinations of types for member function |
| `T& T::add(const P&)` can be summarized in the |
| ['*overload table*] below: |
| |
| `` |
| // overload table for T\P| e i b p |
| T& T::add(const P&) ---+-------- |
| T& add(T&, const P&) s | s |
| m | m |
| S | S S |
| M | M M |
| `` |
| |
| The next table contains complexity characteristics for `add`. |
| |
| [table Time Complexity for member function add on icl containers |
| [[`T& T::add(const P&)`\n |
| `T& add(T&, const P&)`] [__ch_dom_t__][__ch_itv_t__][__ch_dom_mp_t__][__ch_itv_mp_t__]] |
| [[__icl_set__] [__Olgn__] [] [] [] ] |
| [[__icl_map__] [] [] [__Olgn__][] ] |
| [[__itv_set__\n__sep_itv_set__][__Olgn__] [__a_Olgn__][] [] ] |
| [[__spl_itv_set__] [__Olgn__] [__On__] [] [] ] |
| [[__itv_map__\n__spl_itv_map__][] [] [__Olgn__][__On__] ] |
| ] |
| |
| [h5 Hinted addition] |
| |
| Function `J T::add(J prior, const P& addend)` allows |
| for an addition in ['*constant time*], if `addend` can be inserted |
| right after iterator `prior` without collision. If this is not possible |
| the complexity characteristics are as stated for the non hinted addition |
| above. Hinted addition is available for these combinations of types: |
| `` |
| // overload table for addition with hint T\P| e i b p |
| J T::add(J prior, const P&) ---+-------- |
| J add(T&, J prior, const P&) s | s |
| m | m |
| S | S |
| M | M |
| `` |
| |
| [endsect][/ Functions Addition] |
| |
| [section Inplace operators] |
| |
| The possible overloads of inplace `T& operator += (T&, const P&)` |
| are given by two tables, that show admissible combinations of types. |
| Row types show instantiations of argument type `T`. Columns types |
| show show instantiations of argument type `P`. If a combination |
| of argument types is possible, the related table cell contains |
| the result type of the operation. |
| __eiS_Phs__ __eibpsSmM__ will be used to denote |
| /elements, intervals, |
| element value pairs, interval value pairs, |
| element sets, interval sets, |
| element maps/ and /interval maps/. |
| The first table shows the |
| overloads of `+=` for /element containers/ the second table |
| refers to /interval containers/. |
| |
| `` |
| // overload tables for element containers: interval containers: |
| T& operator += (T&, const P&) += | e b s m += | e i b p S M |
| ---+-------- ---+------------ |
| s | s s S | S S S |
| m | m m M | M M M |
| `` |
| |
| For the definition of admissible overloads |
| we separate /element containers/ from /interval containers/. |
| Within each group all combinations of types are supported |
| for an operation, that are in line with the *icl's* |
| design and the sets of laws, that establish the *icl's* |
| [link boost_icl.semantics semantics]. |
| |
| |
| Overloads between /element containers/ and /interval containers/ |
| could also be defined. But this has not been done for |
| pragmatical reasons: Each additional combination of types |
| for an operation enlarges the space of possible overloads. |
| This makes the overload resolution by compilers more complex, |
| error prone and slows down compilation speed. Error messages |
| for unresolvable or ambiguous overloads are difficult |
| to read and understand. Therefore overloading of namespace |
| global functions in the *icl* are limited to a reasonable |
| field of combinations, that are described here. |
| |
| [endsect][/ Inplace operators] |
| |
| |
| [h4 Complexity] |
| |
| For different combinations of argument types `T` and `P` |
| different implementations of the `operator +=` are |
| selected. These implementations show different complexity |
| characteristics. |
| If `T` is a container type, |
| the combination of |
| domain elements (__e) or element value pairs (__b) |
| is faster than a combination of intervals (__i) or |
| interval value pairs (__p) which in turn is faster than |
| the combination of element or interval containers. |
| The next table shows /time complexities/ of addition for |
| *icl's* element containers. |
| |
| Sizes `n` and `m` are in the complexity statements are sizes |
| of objects `T y` and `P x`: |
| `` |
| n = iterative_size(y); |
| m = iterative_size(x); //if P is a container type |
| `` |
| Note, that for an interval container the number of elements `T::size` is |
| different from the number of intervals that you can iterate over. |
| Therefore a function `T::iterative_size()` is used that provides the |
| desired kind of size. |
| |
| [table Time Complexity for inplace Addition on element containers |
| [[`T& operator += (T& y, const P& x)`][__ch_dom_t__][__ch_dom_mp_t__][__ch_icl_sets__][__ch_icl_maps__]] |
| [[__icl_set__] [__Olgn__] [] [__Om__] [] ] |
| [[__icl_map__] [] [__Olgn__] [] [__Om__] ] |
| ] |
| |
| Time complexity characteristics of inplace addition for interval containers |
| is given by this table. |
| |
| [table Time Complexity for inplace Addition on interval containers |
| [[`T& operator += (T& y, const P& x)`][][__ch_dom_t__][__ch_itv_t__][__ch_dom_mp_t__][__ch_itv_mp_t__][__ch_itv_sets__][__ch_itv_maps__]] |
| [[interval_sets][__itv_set__\n__sep_itv_set__][__Olgn__] [__a_Olgn__][] [] [__Omlgnpm__] [] ] |
| [[] [__spl_itv_set__] [__Olgn__] [__On__] [] [] [__Omlgnpm__] [] ] |
| [[interval_maps][] [] [] [__Olgn__][__On__] [] [__Omlgnpm__] ] |
| ] |
| |
| Since the implementation of |
| element and interval containers is based on the |
| [link boost_icl.implementation link red-black tree implementation] |
| of std::AssociativeContainers, we have a logarithmic complexity for |
| addition of elements. |
| Addition of intervals or interval value pairs is amortized logarithmic |
| for __itv_sets__ and __sep_itv_sets__ and linear for __spl_itv_sets__ |
| and __itv_maps__. |
| Addition is linear for element containers and |
| loglinear for interval containers. |
| |
| |
| [section Infix operators] |
| |
| The admissible type combinations for infix `operator +` |
| are defined by the overload tables below. |
| |
| `` |
| // overload tables for element containers: interval containers: |
| T operator + (T, const P&) + | e b s m + | e i b p S1 S2 S3 M1 M3 |
| T operator + (const P&, T) ---+-------- ---+--------------------------- |
| e | s e | S1 S2 S3 |
| b | m i | S1 S2 S3 |
| s | s s b | M1 M3 |
| m | m m p | M1 M3 |
| S1 | S1 S1 S1 S2 S3 |
| S2 | S2 S2 S2 S2 S3 |
| S3 | S3 S3 S3 S3 S3 |
| M1 | M1 M1 M1 M3 |
| M3 | M3 M3 M3 M3 |
| `` |
| |
| [endsect][/ Infix operators] |
| |
| |
| ['*See also . . .*] |
| [table |
| [] |
| [[[link boost_icl.function_reference.subtraction ['*Subtraction*]] ]] |
| [[[link boost_icl.function_reference.insertion ['*Insertion*]] ]] |
| ] |
| |
| ['*Back to section . . .*] |
| [table |
| [] |
| [[[link function_synopsis_table ['*Function Synopsis*]] ]] |
| [[[link boost_icl.interface ['*Interface*]] ]] |
| ] |
| |
| [endsect][/ Addition] |
| |
| |