/
usr
/
include
/
boost
/
/usr/include/boost
mkdir
upload
Name
Size
Mode
Actions
accumulators/
-
0755
rm
algorithm/
-
0755
rm
align/
-
0755
rm
archive/
-
0755
rm
asio/
-
0755
rm
assert/
-
0755
rm
assign/
-
0755
rm
atomic/
-
0755
rm
beast/
-
0755
rm
bimap/
-
0755
rm
bind/
-
0755
rm
callable_traits/
-
0755
rm
chrono/
-
0755
rm
circular_buffer/
-
0755
rm
compatibility/
-
0755
rm
compute/
-
0755
rm
concept/
-
0755
rm
concept_check/
-
0755
rm
config/
-
0755
rm
container/
-
0755
rm
container_hash/
-
0755
rm
context/
-
0755
rm
contract/
-
0755
rm
convert/
-
0755
rm
core/
-
0755
rm
coroutine/
-
0755
rm
coroutine2/
-
0755
rm
date_time/
-
0755
rm
detail/
-
0755
rm
dll/
-
0755
rm
dynamic_bitset/
-
0755
rm
endian/
-
0755
rm
exception/
-
0755
rm
fiber/
-
0755
rm
filesystem/
-
0755
rm
flyweight/
-
0755
rm
format/
-
0755
rm
function/
-
0755
rm
functional/
-
0755
rm
function_types/
-
0755
rm
fusion/
-
0755
rm
geometry/
-
0755
rm
gil/
-
0755
rm
graph/
-
0755
rm
hana/
-
0755
rm
heap/
-
0755
rm
histogram/
-
0755
rm
hof/
-
0755
rm
icl/
-
0755
rm
integer/
-
0755
rm
interprocess/
-
0755
rm
intrusive/
-
0755
rm
io/
-
0755
rm
iostreams/
-
0755
rm
iterator/
-
0755
rm
lambda/
-
0755
rm
lexical_cast/
-
0755
rm
locale/
-
0755
rm
local_function/
-
0755
rm
lockfree/
-
0755
rm
log/
-
0755
rm
logic/
-
0755
rm
math/
-
0755
rm
metaparse/
-
0755
rm
move/
-
0755
rm
mp11/
-
0755
rm
mpi/
-
0755
rm
mpl/
-
0755
rm
msm/
-
0755
rm
multiprecision/
-
0755
rm
multi_array/
-
0755
rm
multi_index/
-
0755
rm
nowide/
-
0755
rm
numeric/
-
0755
rm
optional/
-
0755
rm
outcome/
-
0755
rm
parameter/
-
0755
rm
pending/
-
0755
rm
phoenix/
-
0755
rm
polygon/
-
0755
rm
poly_collection/
-
0755
rm
pool/
-
0755
rm
predef/
-
0755
rm
preprocessor/
-
0755
rm
process/
-
0755
rm
program_options/
-
0755
rm
property_map/
-
0755
rm
property_tree/
-
0755
rm
proto/
-
0755
rm
ptr_container/
-
0755
rm
python/
-
0755
rm
qvm/
-
0755
rm
random/
-
0755
rm
range/
-
0755
rm
ratio/
-
0755
rm
regex/
-
0755
rm
safe_numerics/
-
0755
rm
serialization/
-
0755
rm
signals2/
-
0755
rm
smart_ptr/
-
0755
rm
sort/
-
0755
rm
spirit/
-
0755
rm
stacktrace/
-
0755
rm
statechart/
-
0755
rm
static_string/
-
0755
rm
stl_interfaces/
-
0755
rm
system/
-
0755
rm
test/
-
0755
rm
thread/
-
0755
rm
timer/
-
0755
rm
tti/
-
0755
rm
tuple/
-
0755
rm
typeof/
-
0755
rm
type_erasure/
-
0755
rm
type_index/
-
0755
rm
type_traits/
-
0755
rm
units/
-
0755
rm
unordered/
-
0755
rm
utility/
-
0755
rm
uuid/
-
0755
rm
variant/
-
0755
rm
variant2/
-
0755
rm
vmd/
-
0755
rm
wave/
-
0755
rm
winapi/
-
0755
rm
xpressive/
-
0755
rm
yap/
-
0755
rm
align.hpp
633
0644
edit
dl
rm
aligned_storage.hpp
653
0644
edit
dl
rm
any.hpp
9472
0644
edit
dl
rm
array.hpp
15827
0644
edit
dl
rm
asio.hpp
7472
0644
edit
dl
rm
assert.hpp
2625
0644
edit
dl
rm
assign.hpp
592
0644
edit
dl
rm
atomic.hpp
754
0644
edit
dl
rm
beast.hpp
591
0644
edit
dl
rm
bimap.hpp
387
0644
edit
dl
rm
bind.hpp
1809
0644
edit
dl
rm
blank.hpp
1985
0644
edit
dl
rm
blank_fwd.hpp
618
0644
edit
dl
rm
callable_traits.hpp
2138
0644
edit
dl
rm
call_traits.hpp
633
0644
edit
dl
rm
cast.hpp
584
0644
edit
dl
rm
cerrno.hpp
4187
0644
edit
dl
rm
checked_delete.hpp
414
0644
edit
dl
rm
chrono.hpp
706
0644
edit
dl
rm
circular_buffer.hpp
1946
0644
edit
dl
rm
circular_buffer_fwd.hpp
1137
0644
edit
dl
rm
compressed_pair.hpp
653
0644
edit
dl
rm
compute.hpp
1523
0644
edit
dl
rm
concept_archetype.hpp
23725
0644
edit
dl
rm
concept_check.hpp
31977
0644
edit
dl
rm
config.hpp
2216
0644
edit
dl
rm
contract.hpp
1842
0644
edit
dl
rm
contract_macro.hpp
56497
0644
edit
dl
rm
convert.hpp
7402
0644
edit
dl
rm
crc.hpp
94883
0644
edit
dl
rm
cregex.hpp
721
0644
edit
dl
rm
cstdfloat.hpp
2611
0644
edit
dl
rm
cstdint.hpp
18497
0644
edit
dl
rm
cstdlib.hpp
1739
0644
edit
dl
rm
current_function.hpp
1681
0644
edit
dl
rm
cxx11_char_types.hpp
4160
0644
edit
dl
rm
date_time.hpp
540
0644
edit
dl
rm
dll.hpp
712
0644
edit
dl
rm
dynamic_bitset.hpp
560
0644
edit
dl
rm
dynamic_bitset_fwd.hpp
675
0644
edit
dl
rm
enable_shared_from_this.hpp
525
0644
edit
dl
rm
endian.hpp
364
0644
edit
dl
rm
exception_ptr.hpp
396
0644
edit
dl
rm
filesystem.hpp
862
0644
edit
dl
rm
flyweight.hpp
604
0644
edit
dl
rm
foreach.hpp
45551
0644
edit
dl
rm
foreach_fwd.hpp
1702
0644
edit
dl
rm
format.hpp
2179
0644
edit
dl
rm
function.hpp
2524
0644
edit
dl
rm
functional.hpp
20124
0644
edit
dl
rm
function_equal.hpp
791
0644
edit
dl
rm
function_output_iterator.hpp
630
0644
edit
dl
rm
generator_iterator.hpp
2028
0644
edit
dl
rm
geometry.hpp
704
0644
edit
dl
rm
get_pointer.hpp
2288
0644
edit
dl
rm
gil.hpp
1697
0644
edit
dl
rm
hana.hpp
6807
0644
edit
dl
rm
histogram.hpp
1312
0644
edit
dl
rm
hof.hpp
2009
0644
edit
dl
rm
implicit_cast.hpp
810
0644
edit
dl
rm
indirect_reference.hpp
1036
0644
edit
dl
rm
integer.hpp
11593
0644
edit
dl
rm
integer_fwd.hpp
5181
0644
edit
dl
rm
integer_traits.hpp
8319
0644
edit
dl
rm
intrusive_ptr.hpp
481
0644
edit
dl
rm
io_fwd.hpp
1879
0644
edit
dl
rm
is_placeholder.hpp
634
0644
edit
dl
rm
iterator.hpp
459
0644
edit
dl
rm
iterator_adaptors.hpp
466
0644
edit
dl
rm
lexical_cast.hpp
3275
0644
edit
dl
rm
limits.hpp
6156
0644
edit
dl
rm
locale.hpp
887
0644
edit
dl
rm
local_function.hpp
18858
0644
edit
dl
rm
make_default.hpp
1510
0644
edit
dl
rm
make_shared.hpp
464
0644
edit
dl
rm
make_unique.hpp
293
0644
edit
dl
rm
math_fwd.hpp
975
0644
edit
dl
rm
memory_order.hpp
2457
0644
edit
dl
rm
mem_fn.hpp
596
0644
edit
dl
rm
metaparse.hpp
5281
0644
edit
dl
rm
mp11.hpp
641
0644
edit
dl
rm
mpi.hpp
1101
0644
edit
dl
rm
multi_array.hpp
18021
0644
edit
dl
rm
multi_index_container.hpp
44983
0644
edit
dl
rm
multi_index_container_fwd.hpp
3776
0644
edit
dl
rm
next_prior.hpp
5127
0644
edit
dl
rm
noncopyable.hpp
402
0644
edit
dl
rm
nondet_random.hpp
532
0644
edit
dl
rm
none.hpp
1609
0644
edit
dl
rm
none_t.hpp
953
0644
edit
dl
rm
non_type.hpp
619
0644
edit
dl
rm
operators.hpp
36574
0644
edit
dl
rm
operators_v1.hpp
37735
0644
edit
dl
rm
optional.hpp
528
0644
edit
dl
rm
outcome.hpp
1699
0644
edit
dl
rm
parameter.hpp
1082
0644
edit
dl
rm
phoenix.hpp
476
0644
edit
dl
rm
pointee.hpp
1807
0644
edit
dl
rm
pointer_cast.hpp
3688
0644
edit
dl
rm
pointer_to_other.hpp
1197
0644
edit
dl
rm
polymorphic_cast.hpp
5282
0644
edit
dl
rm
polymorphic_pointer_cast.hpp
2829
0644
edit
dl
rm
predef.h
635
0644
edit
dl
rm
preprocessor.hpp
487
0644
edit
dl
rm
process.hpp
1366
0644
edit
dl
rm
program_options.hpp
820
0644
edit
dl
rm
progress.hpp
5734
0644
edit
dl
rm
python.hpp
2950
0644
edit
dl
rm
random.hpp
3854
0644
edit
dl
rm
range.hpp
603
0644
edit
dl
rm
ratio.hpp
349
0644
edit
dl
rm
rational.hpp
39720
0644
edit
dl
rm
ref.hpp
370
0644
edit
dl
rm
regex.h
2174
0644
edit
dl
rm
regex.hpp
823
0644
edit
dl
rm
regex_fwd.hpp
693
0644
edit
dl
rm
scoped_array.hpp
506
0644
edit
dl
rm
scoped_ptr.hpp
497
0644
edit
dl
rm
scope_exit.hpp
54745
0644
edit
dl
rm
shared_array.hpp
536
0644
edit
dl
rm
shared_container_iterator.hpp
2154
0644
edit
dl
rm
shared_ptr.hpp
525
0644
edit
dl
rm
signals2.hpp
752
0644
edit
dl
rm
smart_ptr.hpp
780
0644
edit
dl
rm
spirit.hpp
1133
0644
edit
dl
rm
stacktrace.hpp
499
0644
edit
dl
rm
static_assert.hpp
7213
0644
edit
dl
rm
static_string.hpp
423
0644
edit
dl
rm
swap.hpp
374
0644
edit
dl
rm
thread.hpp
839
0644
edit
dl
rm
throw_exception.hpp
4328
0644
edit
dl
rm
timer.hpp
2781
0644
edit
dl
rm
tokenizer.hpp
2783
0644
edit
dl
rm
token_functions.hpp
19349
0644
edit
dl
rm
token_iterator.hpp
3810
0644
edit
dl
rm
type.hpp
481
0644
edit
dl
rm
type_index.hpp
10757
0644
edit
dl
rm
type_traits.hpp
7431
0644
edit
dl
rm
unordered_map.hpp
568
0644
edit
dl
rm
unordered_set.hpp
568
0644
edit
dl
rm
utility.hpp
880
0644
edit
dl
rm
variant.hpp
883
0644
edit
dl
rm
version.hpp
1117
0644
edit
dl
rm
visit_each.hpp
690
0644
edit
dl
rm
wave.hpp
944
0644
edit
dl
rm
weak_ptr.hpp
462
0644
edit
dl
rm
Edit:
/usr/include/boost/operators_v1.hpp
(37735B)
// Boost operators.hpp header file ----------------------------------------// // (C) Copyright David Abrahams, Jeremy Siek, Daryle Walker 1999-2001. // 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) // See http://www.boost.org/libs/utility/operators.htm for documentation. // Revision History // 22 Feb 16 Preserve old work-arounds. (Daniel Frey) // 16 Dec 10 Limit warning suppression for 4284 to older versions of VC++ // (Matthew Bradbury, fixes #4432) // 07 Aug 08 Added "euclidean" spelling. (Daniel Frey) // 03 Apr 08 Make sure "convertible to bool" is sufficient // for T::operator<, etc. (Daniel Frey) // 24 May 07 Changed empty_base to depend on T, see // http://svn.boost.org/trac/boost/ticket/979 // 21 Oct 02 Modified implementation of operators to allow compilers with a // correct named return value optimization (NRVO) to produce optimal // code. (Daniel Frey) // 02 Dec 01 Bug fixed in random_access_iteratable. (Helmut Zeisel) // 28 Sep 01 Factored out iterator operator groups. (Daryle Walker) // 27 Aug 01 'left' form for non commutative operators added; // additional classes for groups of related operators added; // workaround for empty base class optimization // bug of GCC 3.0 (Helmut Zeisel) // 25 Jun 01 output_iterator_helper changes: removed default template // parameters, added support for self-proxying, additional // documentation and tests (Aleksey Gurtovoy) // 29 May 01 Added operator classes for << and >>. Added input and output // iterator helper classes. Added classes to connect equality and // relational operators. Added classes for groups of related // operators. Reimplemented example operator and iterator helper // classes in terms of the new groups. (Daryle Walker, with help // from Alexy Gurtovoy) // 11 Feb 01 Fixed bugs in the iterator helpers which prevented explicitly // supplied arguments from actually being used (Dave Abrahams) // 04 Jul 00 Fixed NO_OPERATORS_IN_NAMESPACE bugs, major cleanup and // refactoring of compiler workarounds, additional documentation // (Alexy Gurtovoy and Mark Rodgers with some help and prompting from // Dave Abrahams) // 28 Jun 00 General cleanup and integration of bugfixes from Mark Rodgers and // Jeremy Siek (Dave Abrahams) // 20 Jun 00 Changes to accommodate Borland C++Builder 4 and Borland C++ 5.5 // (Mark Rodgers) // 20 Jun 00 Minor fixes to the prior revision (Aleksey Gurtovoy) // 10 Jun 00 Support for the base class chaining technique was added // (Aleksey Gurtovoy). See documentation and the comments below // for the details. // 12 Dec 99 Initial version with iterator operators (Jeremy Siek) // 18 Nov 99 Change name "divideable" to "dividable", remove unnecessary // specializations of dividable, subtractable, modable (Ed Brey) // 17 Nov 99 Add comments (Beman Dawes) // Remove unnecessary specialization of operators<> (Ed Brey) // 15 Nov 99 Fix less_than_comparable<T,U> second operand type for first two // operators.(Beman Dawes) // 12 Nov 99 Add operators templates (Ed Brey) // 11 Nov 99 Add single template parameter version for compilers without // partial specialization (Beman Dawes) // 10 Nov 99 Initial version // 10 Jun 00: // An additional optional template parameter was added to most of // operator templates to support the base class chaining technique (see // documentation for the details). Unfortunately, a straightforward // implementation of this change would have broken compatibility with the // previous version of the library by making it impossible to use the same // template name (e.g. 'addable') for both the 1- and 2-argument versions of // an operator template. This implementation solves the backward-compatibility // issue at the cost of some simplicity. // // One of the complications is an existence of special auxiliary class template // 'is_chained_base<>' (see 'detail' namespace below), which is used // to determine whether its template parameter is a library's operator template // or not. You have to specialize 'is_chained_base<>' for each new // operator template you add to the library. // // However, most of the non-trivial implementation details are hidden behind // several local macros defined below, and as soon as you understand them, // you understand the whole library implementation. #ifndef BOOST_OPERATORS_V1_HPP #define BOOST_OPERATORS_V1_HPP #include <cstddef> #include <iterator> #include <boost/config.hpp> #include <boost/detail/workaround.hpp> #if defined(__sgi) && !defined(__GNUC__) # pragma set woff 1234 #endif #if BOOST_WORKAROUND(BOOST_MSVC, < 1600) # pragma warning( disable : 4284 ) // complaint about return type of #endif // operator-> not begin a UDT namespace boost { namespace detail { template <typename T> class empty_base {}; } // namespace detail } // namespace boost // In this section we supply the xxxx1 and xxxx2 forms of the operator // templates, which are explicitly targeted at the 1-type-argument and // 2-type-argument operator forms, respectively. Some compilers get confused // when inline friend functions are overloaded in namespaces other than the // global namespace. When BOOST_NO_OPERATORS_IN_NAMESPACE is defined, all of // these templates must go in the global namespace. #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE namespace boost { #endif // Basic operator classes (contributed by Dave Abrahams) ------------------// // Note that friend functions defined in a class are implicitly inline. // See the C++ std, 11.4 [class.friend] paragraph 5 template <class T, class U, class B = ::boost::detail::empty_base<T> > struct less_than_comparable2 : B { friend bool operator<=(const T& x, const U& y) { return !static_cast<bool>(x > y); } friend bool operator>=(const T& x, const U& y) { return !static_cast<bool>(x < y); } friend bool operator>(const U& x, const T& y) { return y < x; } friend bool operator<(const U& x, const T& y) { return y > x; } friend bool operator<=(const U& x, const T& y) { return !static_cast<bool>(y < x); } friend bool operator>=(const U& x, const T& y) { return !static_cast<bool>(y > x); } }; template <class T, class B = ::boost::detail::empty_base<T> > struct less_than_comparable1 : B { friend bool operator>(const T& x, const T& y) { return y < x; } friend bool operator<=(const T& x, const T& y) { return !static_cast<bool>(y < x); } friend bool operator>=(const T& x, const T& y) { return !static_cast<bool>(x < y); } }; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct equality_comparable2 : B { friend bool operator==(const U& y, const T& x) { return x == y; } friend bool operator!=(const U& y, const T& x) { return !static_cast<bool>(x == y); } friend bool operator!=(const T& y, const U& x) { return !static_cast<bool>(y == x); } }; template <class T, class B = ::boost::detail::empty_base<T> > struct equality_comparable1 : B { friend bool operator!=(const T& x, const T& y) { return !static_cast<bool>(x == y); } }; // A macro which produces "name_2left" from "name". #define BOOST_OPERATOR2_LEFT(name) name##2##_##left // NRVO-friendly implementation (contributed by Daniel Frey) ---------------// #if defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS) // This is the optimal implementation for ISO/ANSI C++, // but it requires the compiler to implement the NRVO. // If the compiler has no NRVO, this is the best symmetric // implementation available. #define BOOST_BINARY_OPERATOR_COMMUTATIVE( NAME, OP ) \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct NAME##2 : B \ { \ friend T operator OP( const T& lhs, const U& rhs ) \ { T nrv( lhs ); nrv OP##= rhs; return nrv; } \ friend T operator OP( const U& lhs, const T& rhs ) \ { T nrv( rhs ); nrv OP##= lhs; return nrv; } \ }; \ \ template <class T, class B = ::boost::detail::empty_base<T> > \ struct NAME##1 : B \ { \ friend T operator OP( const T& lhs, const T& rhs ) \ { T nrv( lhs ); nrv OP##= rhs; return nrv; } \ }; #define BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( NAME, OP ) \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct NAME##2 : B \ { \ friend T operator OP( const T& lhs, const U& rhs ) \ { T nrv( lhs ); nrv OP##= rhs; return nrv; } \ }; \ \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct BOOST_OPERATOR2_LEFT(NAME) : B \ { \ friend T operator OP( const U& lhs, const T& rhs ) \ { T nrv( lhs ); nrv OP##= rhs; return nrv; } \ }; \ \ template <class T, class B = ::boost::detail::empty_base<T> > \ struct NAME##1 : B \ { \ friend T operator OP( const T& lhs, const T& rhs ) \ { T nrv( lhs ); nrv OP##= rhs; return nrv; } \ }; #else // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS) // For compilers without NRVO the following code is optimal, but not // symmetric! Note that the implementation of // BOOST_OPERATOR2_LEFT(NAME) only looks cool, but doesn't provide // optimization opportunities to the compiler :) #define BOOST_BINARY_OPERATOR_COMMUTATIVE( NAME, OP ) \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct NAME##2 : B \ { \ friend T operator OP( T lhs, const U& rhs ) { return lhs OP##= rhs; } \ friend T operator OP( const U& lhs, T rhs ) { return rhs OP##= lhs; } \ }; \ \ template <class T, class B = ::boost::detail::empty_base<T> > \ struct NAME##1 : B \ { \ friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; } \ }; #define BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( NAME, OP ) \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct NAME##2 : B \ { \ friend T operator OP( T lhs, const U& rhs ) { return lhs OP##= rhs; } \ }; \ \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct BOOST_OPERATOR2_LEFT(NAME) : B \ { \ friend T operator OP( const U& lhs, const T& rhs ) \ { return T( lhs ) OP##= rhs; } \ }; \ \ template <class T, class B = ::boost::detail::empty_base<T> > \ struct NAME##1 : B \ { \ friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; } \ }; #endif // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS) BOOST_BINARY_OPERATOR_COMMUTATIVE( multipliable, * ) BOOST_BINARY_OPERATOR_COMMUTATIVE( addable, + ) BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( subtractable, - ) BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( dividable, / ) BOOST_BINARY_OPERATOR_NON_COMMUTATIVE( modable, % ) BOOST_BINARY_OPERATOR_COMMUTATIVE( xorable, ^ ) BOOST_BINARY_OPERATOR_COMMUTATIVE( andable, & ) BOOST_BINARY_OPERATOR_COMMUTATIVE( orable, | ) #undef BOOST_BINARY_OPERATOR_COMMUTATIVE #undef BOOST_BINARY_OPERATOR_NON_COMMUTATIVE #undef BOOST_OPERATOR2_LEFT // incrementable and decrementable contributed by Jeremy Siek template <class T, class B = ::boost::detail::empty_base<T> > struct incrementable : B { friend T operator++(T& x, int) { incrementable_type nrv(x); ++x; return nrv; } private: // The use of this typedef works around a Borland bug typedef T incrementable_type; }; template <class T, class B = ::boost::detail::empty_base<T> > struct decrementable : B { friend T operator--(T& x, int) { decrementable_type nrv(x); --x; return nrv; } private: // The use of this typedef works around a Borland bug typedef T decrementable_type; }; // Iterator operator classes (contributed by Jeremy Siek) ------------------// template <class T, class P, class B = ::boost::detail::empty_base<T> > struct dereferenceable : B { P operator->() const { return &*static_cast<const T&>(*this); } }; template <class T, class I, class R, class B = ::boost::detail::empty_base<T> > struct indexable : B { R operator[](I n) const { return *(static_cast<const T&>(*this) + n); } }; // More operator classes (contributed by Daryle Walker) --------------------// // (NRVO-friendly implementation contributed by Daniel Frey) ---------------// #if defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS) #define BOOST_BINARY_OPERATOR( NAME, OP ) \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct NAME##2 : B \ { \ friend T operator OP( const T& lhs, const U& rhs ) \ { T nrv( lhs ); nrv OP##= rhs; return nrv; } \ }; \ \ template <class T, class B = ::boost::detail::empty_base<T> > \ struct NAME##1 : B \ { \ friend T operator OP( const T& lhs, const T& rhs ) \ { T nrv( lhs ); nrv OP##= rhs; return nrv; } \ }; #else // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS) #define BOOST_BINARY_OPERATOR( NAME, OP ) \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct NAME##2 : B \ { \ friend T operator OP( T lhs, const U& rhs ) { return lhs OP##= rhs; } \ }; \ \ template <class T, class B = ::boost::detail::empty_base<T> > \ struct NAME##1 : B \ { \ friend T operator OP( T lhs, const T& rhs ) { return lhs OP##= rhs; } \ }; #endif // defined(BOOST_HAS_NRVO) || defined(BOOST_FORCE_SYMMETRIC_OPERATORS) BOOST_BINARY_OPERATOR( left_shiftable, << ) BOOST_BINARY_OPERATOR( right_shiftable, >> ) #undef BOOST_BINARY_OPERATOR template <class T, class U, class B = ::boost::detail::empty_base<T> > struct equivalent2 : B { friend bool operator==(const T& x, const U& y) { return !static_cast<bool>(x < y) && !static_cast<bool>(x > y); } }; template <class T, class B = ::boost::detail::empty_base<T> > struct equivalent1 : B { friend bool operator==(const T&x, const T&y) { return !static_cast<bool>(x < y) && !static_cast<bool>(y < x); } }; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct partially_ordered2 : B { friend bool operator<=(const T& x, const U& y) { return static_cast<bool>(x < y) || static_cast<bool>(x == y); } friend bool operator>=(const T& x, const U& y) { return static_cast<bool>(x > y) || static_cast<bool>(x == y); } friend bool operator>(const U& x, const T& y) { return y < x; } friend bool operator<(const U& x, const T& y) { return y > x; } friend bool operator<=(const U& x, const T& y) { return static_cast<bool>(y > x) || static_cast<bool>(y == x); } friend bool operator>=(const U& x, const T& y) { return static_cast<bool>(y < x) || static_cast<bool>(y == x); } }; template <class T, class B = ::boost::detail::empty_base<T> > struct partially_ordered1 : B { friend bool operator>(const T& x, const T& y) { return y < x; } friend bool operator<=(const T& x, const T& y) { return static_cast<bool>(x < y) || static_cast<bool>(x == y); } friend bool operator>=(const T& x, const T& y) { return static_cast<bool>(y < x) || static_cast<bool>(x == y); } }; // Combined operator classes (contributed by Daryle Walker) ----------------// template <class T, class U, class B = ::boost::detail::empty_base<T> > struct totally_ordered2 : less_than_comparable2<T, U , equality_comparable2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct totally_ordered1 : less_than_comparable1<T , equality_comparable1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct additive2 : addable2<T, U , subtractable2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct additive1 : addable1<T , subtractable1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct multiplicative2 : multipliable2<T, U , dividable2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct multiplicative1 : multipliable1<T , dividable1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct integer_multiplicative2 : multiplicative2<T, U , modable2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct integer_multiplicative1 : multiplicative1<T , modable1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct arithmetic2 : additive2<T, U , multiplicative2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct arithmetic1 : additive1<T , multiplicative1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct integer_arithmetic2 : additive2<T, U , integer_multiplicative2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct integer_arithmetic1 : additive1<T , integer_multiplicative1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct bitwise2 : xorable2<T, U , andable2<T, U , orable2<T, U, B > > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct bitwise1 : xorable1<T , andable1<T , orable1<T, B > > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct unit_steppable : incrementable<T , decrementable<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct shiftable2 : left_shiftable2<T, U , right_shiftable2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct shiftable1 : left_shiftable1<T , right_shiftable1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct ring_operators2 : additive2<T, U , subtractable2_left<T, U , multipliable2<T, U, B > > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct ring_operators1 : additive1<T , multipliable1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct ordered_ring_operators2 : ring_operators2<T, U , totally_ordered2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct ordered_ring_operators1 : ring_operators1<T , totally_ordered1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct field_operators2 : ring_operators2<T, U , dividable2<T, U , dividable2_left<T, U, B > > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct field_operators1 : ring_operators1<T , dividable1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct ordered_field_operators2 : field_operators2<T, U , totally_ordered2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct ordered_field_operators1 : field_operators1<T , totally_ordered1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct euclidian_ring_operators2 : ring_operators2<T, U , dividable2<T, U , dividable2_left<T, U , modable2<T, U , modable2_left<T, U, B > > > > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct euclidian_ring_operators1 : ring_operators1<T , dividable1<T , modable1<T, B > > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct ordered_euclidian_ring_operators2 : totally_ordered2<T, U , euclidian_ring_operators2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct ordered_euclidian_ring_operators1 : totally_ordered1<T , euclidian_ring_operators1<T, B > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct euclidean_ring_operators2 : ring_operators2<T, U , dividable2<T, U , dividable2_left<T, U , modable2<T, U , modable2_left<T, U, B > > > > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct euclidean_ring_operators1 : ring_operators1<T , dividable1<T , modable1<T, B > > > {}; template <class T, class U, class B = ::boost::detail::empty_base<T> > struct ordered_euclidean_ring_operators2 : totally_ordered2<T, U , euclidean_ring_operators2<T, U, B > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct ordered_euclidean_ring_operators1 : totally_ordered1<T , euclidean_ring_operators1<T, B > > {}; template <class T, class P, class B = ::boost::detail::empty_base<T> > struct input_iteratable : equality_comparable1<T , incrementable<T , dereferenceable<T, P, B > > > {}; template <class T, class B = ::boost::detail::empty_base<T> > struct output_iteratable : incrementable<T, B > {}; template <class T, class P, class B = ::boost::detail::empty_base<T> > struct forward_iteratable : input_iteratable<T, P, B > {}; template <class T, class P, class B = ::boost::detail::empty_base<T> > struct bidirectional_iteratable : forward_iteratable<T, P , decrementable<T, B > > {}; // To avoid repeated derivation from equality_comparable, // which is an indirect base class of bidirectional_iterable, // random_access_iteratable must not be derived from totally_ordered1 // but from less_than_comparable1 only. (Helmut Zeisel, 02-Dec-2001) template <class T, class P, class D, class R, class B = ::boost::detail::empty_base<T> > struct random_access_iteratable : bidirectional_iteratable<T, P , less_than_comparable1<T , additive2<T, D , indexable<T, D, R, B > > > > {}; #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE } // namespace boost #endif // BOOST_NO_OPERATORS_IN_NAMESPACE // BOOST_IMPORT_TEMPLATE1 .. BOOST_IMPORT_TEMPLATE4 - // // When BOOST_NO_OPERATORS_IN_NAMESPACE is defined we need a way to import an // operator template into the boost namespace. BOOST_IMPORT_TEMPLATE1 is used // for one-argument forms of operator templates; BOOST_IMPORT_TEMPLATE2 for // two-argument forms. Note that these macros expect to be invoked from within // boost. #ifndef BOOST_NO_OPERATORS_IN_NAMESPACE // The template is already in boost so we have nothing to do. # define BOOST_IMPORT_TEMPLATE4(template_name) # define BOOST_IMPORT_TEMPLATE3(template_name) # define BOOST_IMPORT_TEMPLATE2(template_name) # define BOOST_IMPORT_TEMPLATE1(template_name) #else // BOOST_NO_OPERATORS_IN_NAMESPACE # ifndef BOOST_NO_USING_TEMPLATE // Bring the names in with a using-declaration // to avoid stressing the compiler. # define BOOST_IMPORT_TEMPLATE4(template_name) using ::template_name; # define BOOST_IMPORT_TEMPLATE3(template_name) using ::template_name; # define BOOST_IMPORT_TEMPLATE2(template_name) using ::template_name; # define BOOST_IMPORT_TEMPLATE1(template_name) using ::template_name; # else // Otherwise, because a Borland C++ 5.5 bug prevents a using declaration // from working, we are forced to use inheritance for that compiler. # define BOOST_IMPORT_TEMPLATE4(template_name) \ template <class T, class U, class V, class W, class B = ::boost::detail::empty_base<T> > \ struct template_name : ::template_name<T, U, V, W, B> {}; # define BOOST_IMPORT_TEMPLATE3(template_name) \ template <class T, class U, class V, class B = ::boost::detail::empty_base<T> > \ struct template_name : ::template_name<T, U, V, B> {}; # define BOOST_IMPORT_TEMPLATE2(template_name) \ template <class T, class U, class B = ::boost::detail::empty_base<T> > \ struct template_name : ::template_name<T, U, B> {}; # define BOOST_IMPORT_TEMPLATE1(template_name) \ template <class T, class B = ::boost::detail::empty_base<T> > \ struct template_name : ::template_name<T, B> {}; # endif // BOOST_NO_USING_TEMPLATE #endif // BOOST_NO_OPERATORS_IN_NAMESPACE // // Here's where we put it all together, defining the xxxx forms of the templates // in namespace boost. We also define specializations of is_chained_base<> for // the xxxx, xxxx1, and xxxx2 templates, importing them into boost:: as // necessary. // // is_chained_base<> - a traits class used to distinguish whether an operator // template argument is being used for base class chaining, or is specifying a // 2nd argument type. namespace boost { // A type parameter is used instead of a plain bool because Borland's compiler // didn't cope well with the more obvious non-type template parameter. namespace detail { struct true_t {}; struct false_t {}; } // namespace detail // Unspecialized version assumes that most types are not being used for base // class chaining. We specialize for the operator templates defined in this // library. template<class T> struct is_chained_base { typedef ::boost::detail::false_t value; }; } // namespace boost // Import a 4-type-argument operator template into boost (if necessary) and // provide a specialization of 'is_chained_base<>' for it. # define BOOST_OPERATOR_TEMPLATE4(template_name4) \ BOOST_IMPORT_TEMPLATE4(template_name4) \ template<class T, class U, class V, class W, class B> \ struct is_chained_base< ::boost::template_name4<T, U, V, W, B> > { \ typedef ::boost::detail::true_t value; \ }; // Import a 3-type-argument operator template into boost (if necessary) and // provide a specialization of 'is_chained_base<>' for it. # define BOOST_OPERATOR_TEMPLATE3(template_name3) \ BOOST_IMPORT_TEMPLATE3(template_name3) \ template<class T, class U, class V, class B> \ struct is_chained_base< ::boost::template_name3<T, U, V, B> > { \ typedef ::boost::detail::true_t value; \ }; // Import a 2-type-argument operator template into boost (if necessary) and // provide a specialization of 'is_chained_base<>' for it. # define BOOST_OPERATOR_TEMPLATE2(template_name2) \ BOOST_IMPORT_TEMPLATE2(template_name2) \ template<class T, class U, class B> \ struct is_chained_base< ::boost::template_name2<T, U, B> > { \ typedef ::boost::detail::true_t value; \ }; // Import a 1-type-argument operator template into boost (if necessary) and // provide a specialization of 'is_chained_base<>' for it. # define BOOST_OPERATOR_TEMPLATE1(template_name1) \ BOOST_IMPORT_TEMPLATE1(template_name1) \ template<class T, class B> \ struct is_chained_base< ::boost::template_name1<T, B> > { \ typedef ::boost::detail::true_t value; \ }; // BOOST_OPERATOR_TEMPLATE(template_name) defines template_name<> such that it // can be used for specifying both 1-argument and 2-argument forms. Requires the // existence of two previously defined class templates named '<template_name>1' // and '<template_name>2' which must implement the corresponding 1- and 2- // argument forms. // // The template type parameter O == is_chained_base<U>::value is used to // distinguish whether the 2nd argument to <template_name> is being used for // base class chaining from another boost operator template or is describing a // 2nd operand type. O == true_t only when U is actually an another operator // template from the library. Partial specialization is used to select an // implementation in terms of either '<template_name>1' or '<template_name>2'. // # define BOOST_OPERATOR_TEMPLATE(template_name) \ template <class T \ ,class U = T \ ,class B = ::boost::detail::empty_base<T> \ ,class O = typename is_chained_base<U>::value \ > \ struct template_name : template_name##2<T, U, B> {}; \ \ template<class T, class U, class B> \ struct template_name<T, U, B, ::boost::detail::true_t> \ : template_name##1<T, U> {}; \ \ template <class T, class B> \ struct template_name<T, T, B, ::boost::detail::false_t> \ : template_name##1<T, B> {}; \ \ template<class T, class U, class B, class O> \ struct is_chained_base< ::boost::template_name<T, U, B, O> > { \ typedef ::boost::detail::true_t value; \ }; \ \ BOOST_OPERATOR_TEMPLATE2(template_name##2) \ BOOST_OPERATOR_TEMPLATE1(template_name##1) namespace boost { BOOST_OPERATOR_TEMPLATE(less_than_comparable) BOOST_OPERATOR_TEMPLATE(equality_comparable) BOOST_OPERATOR_TEMPLATE(multipliable) BOOST_OPERATOR_TEMPLATE(addable) BOOST_OPERATOR_TEMPLATE(subtractable) BOOST_OPERATOR_TEMPLATE2(subtractable2_left) BOOST_OPERATOR_TEMPLATE(dividable) BOOST_OPERATOR_TEMPLATE2(dividable2_left) BOOST_OPERATOR_TEMPLATE(modable) BOOST_OPERATOR_TEMPLATE2(modable2_left) BOOST_OPERATOR_TEMPLATE(xorable) BOOST_OPERATOR_TEMPLATE(andable) BOOST_OPERATOR_TEMPLATE(orable) BOOST_OPERATOR_TEMPLATE1(incrementable) BOOST_OPERATOR_TEMPLATE1(decrementable) BOOST_OPERATOR_TEMPLATE2(dereferenceable) BOOST_OPERATOR_TEMPLATE3(indexable) BOOST_OPERATOR_TEMPLATE(left_shiftable) BOOST_OPERATOR_TEMPLATE(right_shiftable) BOOST_OPERATOR_TEMPLATE(equivalent) BOOST_OPERATOR_TEMPLATE(partially_ordered) BOOST_OPERATOR_TEMPLATE(totally_ordered) BOOST_OPERATOR_TEMPLATE(additive) BOOST_OPERATOR_TEMPLATE(multiplicative) BOOST_OPERATOR_TEMPLATE(integer_multiplicative) BOOST_OPERATOR_TEMPLATE(arithmetic) BOOST_OPERATOR_TEMPLATE(integer_arithmetic) BOOST_OPERATOR_TEMPLATE(bitwise) BOOST_OPERATOR_TEMPLATE1(unit_steppable) BOOST_OPERATOR_TEMPLATE(shiftable) BOOST_OPERATOR_TEMPLATE(ring_operators) BOOST_OPERATOR_TEMPLATE(ordered_ring_operators) BOOST_OPERATOR_TEMPLATE(field_operators) BOOST_OPERATOR_TEMPLATE(ordered_field_operators) BOOST_OPERATOR_TEMPLATE(euclidian_ring_operators) BOOST_OPERATOR_TEMPLATE(ordered_euclidian_ring_operators) BOOST_OPERATOR_TEMPLATE(euclidean_ring_operators) BOOST_OPERATOR_TEMPLATE(ordered_euclidean_ring_operators) BOOST_OPERATOR_TEMPLATE2(input_iteratable) BOOST_OPERATOR_TEMPLATE1(output_iteratable) BOOST_OPERATOR_TEMPLATE2(forward_iteratable) BOOST_OPERATOR_TEMPLATE2(bidirectional_iteratable) BOOST_OPERATOR_TEMPLATE4(random_access_iteratable) #undef BOOST_OPERATOR_TEMPLATE #undef BOOST_OPERATOR_TEMPLATE4 #undef BOOST_OPERATOR_TEMPLATE3 #undef BOOST_OPERATOR_TEMPLATE2 #undef BOOST_OPERATOR_TEMPLATE1 #undef BOOST_IMPORT_TEMPLATE1 #undef BOOST_IMPORT_TEMPLATE2 #undef BOOST_IMPORT_TEMPLATE3 #undef BOOST_IMPORT_TEMPLATE4 // The following 'operators' classes can only be used portably if the derived class // declares ALL of the required member operators. template <class T, class U> struct operators2 : totally_ordered2<T,U , integer_arithmetic2<T,U , bitwise2<T,U > > > {}; template <class T, class U = T> struct operators : operators2<T, U> {}; template <class T> struct operators<T, T> : totally_ordered<T , integer_arithmetic<T , bitwise<T , unit_steppable<T > > > > {}; // Iterator helper classes (contributed by Jeremy Siek) -------------------// // (Input and output iterator helpers contributed by Daryle Walker) -------// // (Changed to use combined operator classes by Daryle Walker) ------------// template <class T, class V, class D = std::ptrdiff_t, class P = V const *, class R = V const &> struct input_iterator_helper : input_iteratable<T, P , std::iterator<std::input_iterator_tag, V, D, P, R > > {}; template<class T> struct output_iterator_helper : output_iteratable<T , std::iterator<std::output_iterator_tag, void, void, void, void > > { T& operator*() { return static_cast<T&>(*this); } T& operator++() { return static_cast<T&>(*this); } }; template <class T, class V, class D = std::ptrdiff_t, class P = V*, class R = V&> struct forward_iterator_helper : forward_iteratable<T, P , std::iterator<std::forward_iterator_tag, V, D, P, R > > {}; template <class T, class V, class D = std::ptrdiff_t, class P = V*, class R = V&> struct bidirectional_iterator_helper : bidirectional_iteratable<T, P , std::iterator<std::bidirectional_iterator_tag, V, D, P, R > > {}; template <class T, class V, class D = std::ptrdiff_t, class P = V*, class R = V&> struct random_access_iterator_helper : random_access_iteratable<T, P, D, R , std::iterator<std::random_access_iterator_tag, V, D, P, R > > { friend D requires_difference_operator(const T& x, const T& y) { return x - y; } }; // random_access_iterator_helper } // namespace boost #if defined(__sgi) && !defined(__GNUC__) #pragma reset woff 1234 #endif #endif // BOOST_OPERATORS_V1_HPP
Save
cmd:
run