blob: 205f848fb905178abf0c0a609b4e1eae83c12b69 [file] [log] [blame]
[/
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)
]
[/ //= Interval Construction ===================================================================]
[section Interval Construction]
[table
[[T] [__ch_dsc_itv__] [__ch_cnt_itv__] [__ch_ro_itv__] [__ch_lo_itv__] [__ch_cl_itv__] [__ch_op_itv__] ]
[[Interval bounds] [dynamic] [dynamic] [static] [static] [static] [static] ]
[[Form] [ ] [ ] [asymmetric] [asymmetric] [symmetric] [symmetric] ]
[[['*Construct*]] [ ] [ ] [ ] [ ] [ ] [ ] ]
[[`T singleton(const P&)`] [__d] [__c] [__d] [__d] [__d] [__d] ]
[[`T construct(const P&, const P&)`] [__d] [__c] [__dc] [__dc] [__d] [__d] ]
[[``
T construct(const P&, const P&,
interval_bounds )
``] [__d] [__c] [ ] [ ] [ ] [ ] ]
[[`T hull(const P&, const P&)`] [__d] [__c] [__dc] [__dc] [__d] [__d] ]
[[`T span(const P&, const P&)`] [__d] [__c] [__dc] [__dc] [__d] [__d] ]
[[`static T right_open(const P&, const P&)`] [__d] [__c] [ ] [ ] [ ] [ ] ]
[[`static T left_open(const P&, const P&)`] [__d] [__c] [ ] [ ] [ ] [ ] ]
[[`static T closed(const P&, const P&)`] [__d] [__c] [ ] [ ] [ ] [ ] ]
[[`static T open(const P&, const P&)`] [__d] [__c] [ ] [ ] [ ] [ ] ]
]
The table above shows the availability of functions, that allow the construction
of intervals. All interval constructin functins are of ['*constant time and space complexity*].
[table
[[['*Construct*]] [Description] ]
[[`T singleton(const P& value)`] [Constructs an interval that contains exactly one element `value`.
For all interval types of the icl sigletons can be constructed
for /discrete/ domain types. For continuous domain types, only
__ct_itv__ is capable to construct a singleton. ] ]
[[`T construct(const P& lower, const P& upper)`] [Contructs an interval with lower bound `lower` and upper bound `upper` ] ]
[[``
T construct(const P& lower, const P& upper,
interval_bounds bounds
= interval_bounds::right_open())
``]
[For dynamically bounded intervals this function constructs an
interval with interval bounds specified by the third parameter. ] ]
[[`T hull(const P& x1, const P& x2)`] [`hull(x1,x2)` constructs the smallest interval that contains both `x1` and `x2`.
`x2` may be smaller than `x1`. ] ]
[[`T span(const P& x1, const P& x2)`] [`span(x1,x2)` constructs the interval `construct(min(x1,x2), max(x1,x2))`.
Note the differences between `span`, `hull` and `construct`:
``
span<right_open_interval<int> >(2,1) == [1,2) // does NOT contain 2
hull<right_open_interval<int> >(2,1) == [1,3) // contains 2
construct<right_open_interval<int> >(2,1) == [) // is empty
``
] ]
[[``
static T right_open(const P&, const P&)
static T left_open(const P&, const P&)
static T closed(const P&, const P&)
static T open(const P&, const P&)
`` ] [For dynamically bounded intervals there are for static functions to
construct intervals with the four interval bound types:
``
discrete_interval<int> itv1 = discrete_interval<int>::closed(0,42);
continuous_interval<double> itv2 = continuous_interval<double>::right_open(0.0, 1.0);
``
] ]
[[['*Using the interval default*]] [ ]]
[[`interval<P>::type`] [There is a library default, for all interval containers of the *icl*.
The intension of the library default is to minimize the need for parameter
specification, when working with *icl* class templates.
We can get the library default interval type as `interval<P>::type`.
The library default uses ['*dynamically bounded intervals*]. You
can switch to ['*statically bounded intervals*] by
`#define BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS` prior to icl includes. ]]
[[``
static T right_open(const P&, const P&)
static T left_open(const P&, const P&)
static T closed(const P&, const P&)
static T open(const P&, const P&)
`` ] [For template struct `interval` that always uses the library default
the static functions for the four interval bound types are also available.
``
interval<int>::type itv1 = interval<int>::closed(0,42);
interval<double>::type itv2 = interval<double>::right_open(0.0, 1.0);
``
This works with the statically bounded intervals as well,
with the restriction that for continuous domain types the
matching function has to be used:
``
#define BOOST_ICL_USE_STATIC_BOUNDED_INTERVALS
. . .
// library default is the statically bounded right_open_interval
interval<int>::type itv1 = interval<int>::closed(0,42); //==[0,43) //ok, bounds are shifted
interval<double>::type itv2 = interval<double>::right_open(0.0, 1.0); //ok. right_open matches
interval<double>::type itv3 = interval<double>::closed(0.0, 1.0); //will NOT compile
``
See also examples
[link boost_icl.examples.dynamic_interval Dynamic intervals] and
[link boost_icl.examples.static_interval Static intervals]
]]
]
['*See also . . .*]
[table
[]
[[[link boost_icl.examples.dynamic_interval ['*Example: Dynamically bounded intervals and the library default*]] ]]
[[[link boost_icl.examples.static_interval ['*Example: Statically bounded intervals, changing the library default*]] ]]
]
['*Back to section . . .*]
[table
[]
[[[link additional_interval_functions ['*Additional interval functions*]] ]]
[[[link function_synopsis_table ['*Function Synopsis*]] ]]
[[[link boost_icl.interface ['*Interface*]] ]]
]
[endsect][/ Interval Construction]