...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
For overloading tables on infix operators, we need to break down interval_sets
and interval_maps
to the specific class templates
choosing Si and Mi as placeholders.
The indices i of Si and Mi represent a property called segmentational fineness or short fineness, which is a type trait on interval containers.
|
|
Segmentational fineness represents the fact, that for interval containers holding the same elements, a splitting interval container may contain more segments as a separating container which in turn may contain more segments than a joining one. So for an
operator >
where
x > y // means that x is_finer_than y // we have finer coarser split_interval_set interval_set > separate_interval_set > split_interval_map interval_map
This relation is needed to resolve the instantiation of infix operators e.g.
T operator
+ (P, Q)
for two interval container types P
and Q
.
If both P
and Q
are candidates for the result type T
, one of them must be chosen by the compiler.
We choose the type that is segmentational finer as result type T
. This way we do not loose the segment information that is stored in the
finer one of the container
types P
and Q
.
// overload tables for T operator + (T, const P&) T operator + (const P&, T) element containers: interval containers: + | e b s m + | e i b p S1 S2 S3 M1 M3 ---+-------- ---+--------------------------- 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
So looking up a type combination for e.g. T
operator +
(interval_map, split_interval_map)
which is equivalent to T
operator +
(M1, M3)
we find for row type M1
and
column type M3
that M3
will be assigned as result type, because
M3
is finer than M1
. So this type combination will result
in choosing this
split_interval_map operator + (const interval_map&, split_interval_map)
implementation by the compiler.