[/
    Copyright (c) 2008-2010 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)
]


[/ //= Symmetric Difference ===================================================]
[section Symmetric Difference]

[section Synopsis][/ Symmetric difference]

[table
[[Symmetric difference]         [__ch_itv_sets__][__ch_itv_maps__][__ch_ele_sets__][__ch_ele_maps__] ]

[[`T& T::flip(const P&)`]                      [__ei]     [__bp]   [ ]     [__b]     ]
[[`T& flip(T&, const P&)`]                     [__ei]     [__bp]   [__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]    ]

]

Functions and operators that implement ['*symmetric difference*] on *icl* objects
are given in the table above.

[table
[[]      [Description of symmetric difference]]
[[`Sets`][`operator ^` implements ['*set symmetric difference*]]]
[[`Maps`][`operator ^` implements a ['*map symmetric difference*] 
          function similar to /set symmetric difference/.
          All pairs that are common to both arguments are removed. All others unified.
         ]]
]


[endsect][/ Synopsis Symmetric difference]

[section Functions][/ Symmetric difference]

/Symmetric difference/ is implemented on interval containers
by the function `T& flip(T&, const P& operand)`.

``
flip(y,x)
`` 

deletes every element of `y`, 
if it is contained in `x`. Elements of
`x` not contained in `y` are added.
For icl containers flip is also availabel as memeber function
`T& T::flip(const P& operand)`.

[/ paratract, surtract, symetract, topple, symmetric_subtract]

The admissible combinations of types for member function 
`T& T::flip(const P&)` can be summarized in the 
['*overload table*] below:

``
/* overload table for */           T\P| e i b p  
T& T::flip(const P&)               ---+--------
T& flip(T&, const P&)               s | s
                                    m |     m
                                    S | S S     
                                    M |     M M
``

The next table contains complexity characteristics for functions `flip`.

[table Time Complexity for member functions flip on icl containers
[[`T& T::flip(const P&)`\n
  `T& flip(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__] [__On__]    []        []          ]
[[__spl_itv_set__]             [__Olgn__] [__On__]    []        []          ]
[[__itv_map__\n__spl_itv_map__][]         []          [__Olgn__][__On__]    ]
]

[endsect][/ Member functions Symmetric difference]


[section Inplace operators][/ Symmetric Difference]

The overload tables below are giving admissible
type combinations for `operator ^=`
that implements ['*symmetric difference*].

``
// 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    
``
Complexity characteristics for inplace operators
that implement ['*symmetric difference*]
are given by the next tables where 
``
n = iterative_size(y);
m = iterative_size(x); //if P is a container
``

[table Time Complexity for inplace symmetric difference on element containers
[[`T& operator &= (T& y, const P& x)`][__ch_dom_t__][__ch_dom_mp_t__][__ch_icl_set__][__ch_icl_map__]]
[[__icl_set__]                    [__Olgn__]    []               [__Omlgn__]     []              ]
[[__icl_map__]                    [__Olgn__]    [__Olgn__]       [__Omlgn__]     [__Omlgn__]     ]
]

[table Time Complexity for inplace symmetric difference on interval containers
[[`T& operator &= (T&, const P&)`][__ch_dom_t__][__ch_itv_t__][__ch_dom_mp_t__][__ch_itv_mp_t__][__ch_itv_sets__][__ch_itv_maps__]]
[[interval_sets]                  [__Olgn__]    [__On__]      []               []               [__Omlgnpm__]    []               ]
[[interval_maps]                  [__Olgn__]    [__On__]      [__Olgn__]       [__On__]         [__Omlgnpm__]    [__Omlgnpm__]    ]
]

[endsect][/ Inplace operators Symmetric Difference]

[section Infix operators][/ Symmetric Difference]

For the infix version of symmetric difference the
following overloads are available:

``
// 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
``

To resolve ambiguities among interval containers
the ['*finer*] container type is chosen as result type.

[endsect][/ Infix operators Symmetric Difference]


['*See also . . .*]
[table
[]
[[[link boost_icl.function_reference.intersection ['*Intersection*]] ]]
[[[link boost_icl.function_reference.subtraction  ['*Subtraction*]]  ]]
[[[link boost_icl.function_reference.addition     ['*Addition*]]     ]]
]
['*Back to section . . .*]
[table
[]
[[[link function_synopsis_table ['*Function Synopsis*]]    ]]
[[[link boost_icl.interface ['*Interface*]]                ]]
]

[endsect][/ Symmetric Difference]


