Skip to content
GitLab
Explore
Sign in
Register
Commits on Source (3)
New upstream version 3.13.1+dfsg
· 14ca7cff
Andreas Tille
authored
Nov 17, 2019
14ca7cff
New upstream version 3.13.1+dfsg
· f1ec307f
Andreas Tille
authored
Nov 17, 2019
f1ec307f
New upstream version 3.13.1+dfsg
· 89b1e879
Andreas Tille
authored
Nov 18, 2019
89b1e879
Show whitespace changes
Inline
Side-by-side
Some changes are not shown.
For a faster browsing experience, only
20 of 1000+
files are shown.
assembler/ext/include/boost/algorithm/algorithm.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2014.
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)
Revision history:
2 Dec 2014 mtc First version; power
*/
/// \file algorithm.hpp
/// \brief Misc Algorithms
/// \author Marshall Clow
///
#ifndef BOOST_ALGORITHM_HPP
#define BOOST_ALGORITHM_HPP
#include
<functional>
// for plus and multiplies
#include
<boost/utility/enable_if.hpp>
// for boost::disable_if
#include
<boost/type_traits/is_integral.hpp>
namespace
boost
{
namespace
algorithm
{
template
<
typename
T
>
T
identity_operation
(
std
::
multiplies
<
T
>
)
{
return
T
(
1
);
}
template
<
typename
T
>
T
identity_operation
(
std
::
plus
<
T
>
)
{
return
T
(
0
);
}
/// \fn power ( T x, Integer n )
/// \return the value "x" raised to the power "n"
///
/// \param x The value to be exponentiated
/// \param n The exponent (must be >= 0)
///
// \remark Taken from Knuth, The Art of Computer Programming, Volume 2:
// Seminumerical Algorithms, Section 4.6.3
template
<
typename
T
,
typename
Integer
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
Integer
>
,
T
>::
type
power
(
T
x
,
Integer
n
)
{
T
y
=
1
;
// Should be "T y{1};"
if
(
n
==
0
)
return
y
;
while
(
true
)
{
if
(
n
%
2
==
1
)
{
y
=
x
*
y
;
if
(
n
==
1
)
return
y
;
}
n
=
n
/
2
;
x
=
x
*
x
;
}
return
y
;
}
/// \fn power ( T x, Integer n, Operation op )
/// \return the value "x" raised to the power "n"
/// using the operation "op".
///
/// \param x The value to be exponentiated
/// \param n The exponent (must be >= 0)
/// \param op The operation used
///
// \remark Taken from Knuth, The Art of Computer Programming, Volume 2:
// Seminumerical Algorithms, Section 4.6.3
template
<
typename
T
,
typename
Integer
,
typename
Operation
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
Integer
>
,
T
>::
type
power
(
T
x
,
Integer
n
,
Operation
op
)
{
T
y
=
identity_operation
(
op
);
if
(
n
==
0
)
return
y
;
while
(
true
)
{
if
(
n
%
2
==
1
)
{
y
=
op
(
x
,
y
);
if
(
n
==
1
)
return
y
;
}
n
=
n
/
2
;
x
=
op
(
x
,
x
);
}
return
y
;
}
}}
#endif // BOOST_ALGORITHM_HPP
assembler/ext/include/boost/algorithm/clamp.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
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)
Revision history:
27 June 2009 mtc First version
23 Oct 2010 mtc Added predicate version
*/
/// \file clamp.hpp
/// \brief Clamp algorithm
/// \author Marshall Clow
///
/// Suggested by olafvdspek in https://svn.boost.org/trac/boost/ticket/3215
#ifndef BOOST_ALGORITHM_CLAMP_HPP
#define BOOST_ALGORITHM_CLAMP_HPP
#include
<functional>
// For std::less
#include
<iterator>
// For std::iterator_traits
#include
<cassert>
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
#include
<boost/mpl/identity.hpp>
// for identity
#include
<boost/utility/enable_if.hpp>
// for boost::disable_if
namespace
boost
{
namespace
algorithm
{
/// \fn clamp ( T const& val,
/// typename boost::mpl::identity<T>::type const & lo,
/// typename boost::mpl::identity<T>::type const & hi, Pred p )
/// \return the value "val" brought into the range [ lo, hi ]
/// using the comparison predicate p.
/// If p ( val, lo ) return lo.
/// If p ( hi, val ) return hi.
/// Otherwise, return the original value.
///
/// \param val The value to be clamped
/// \param lo The lower bound of the range to be clamped to
/// \param hi The upper bound of the range to be clamped to
/// \param p A predicate to use to compare the values.
/// p ( a, b ) returns a boolean.
///
template
<
typename
T
,
typename
Pred
>
T
const
&
clamp
(
T
const
&
val
,
typename
boost
::
mpl
::
identity
<
T
>::
type
const
&
lo
,
typename
boost
::
mpl
::
identity
<
T
>::
type
const
&
hi
,
Pred
p
)
{
// assert ( !p ( hi, lo )); // Can't assert p ( lo, hi ) b/c they might be equal
return
p
(
val
,
lo
)
?
lo
:
p
(
hi
,
val
)
?
hi
:
val
;
}
/// \fn clamp ( T const& val,
/// typename boost::mpl::identity<T>::type const & lo,
/// typename boost::mpl::identity<T>::type const & hi )
/// \return the value "val" brought into the range [ lo, hi ].
/// If the value is less than lo, return lo.
/// If the value is greater than "hi", return hi.
/// Otherwise, return the original value.
///
/// \param val The value to be clamped
/// \param lo The lower bound of the range to be clamped to
/// \param hi The upper bound of the range to be clamped to
///
template
<
typename
T
>
T
const
&
clamp
(
const
T
&
val
,
typename
boost
::
mpl
::
identity
<
T
>::
type
const
&
lo
,
typename
boost
::
mpl
::
identity
<
T
>::
type
const
&
hi
)
{
return
(
clamp
)
(
val
,
lo
,
hi
,
std
::
less
<
T
>
());
}
/// \fn clamp_range ( InputIterator first, InputIterator last, OutputIterator out,
/// std::iterator_traits<InputIterator>::value_type const & lo,
/// std::iterator_traits<InputIterator>::value_type const & hi )
/// \return clamp the sequence of values [first, last) into [ lo, hi ]
///
/// \param first The start of the range of values
/// \param last One past the end of the range of input values
/// \param out An output iterator to write the clamped values into
/// \param lo The lower bound of the range to be clamped to
/// \param hi The upper bound of the range to be clamped to
///
template
<
typename
InputIterator
,
typename
OutputIterator
>
OutputIterator
clamp_range
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
out
,
typename
std
::
iterator_traits
<
InputIterator
>::
value_type
const
&
lo
,
typename
std
::
iterator_traits
<
InputIterator
>::
value_type
const
&
hi
)
{
// this could also be written with bind and std::transform
while
(
first
!=
last
)
*
out
++
=
clamp
(
*
first
++
,
lo
,
hi
);
return
out
;
}
/// \fn clamp_range ( const Range &r, OutputIterator out,
/// typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type const & lo,
/// typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type const & hi )
/// \return clamp the sequence of values [first, last) into [ lo, hi ]
///
/// \param r The range of values to be clamped
/// \param out An output iterator to write the clamped values into
/// \param lo The lower bound of the range to be clamped to
/// \param hi The upper bound of the range to be clamped to
///
template
<
typename
Range
,
typename
OutputIterator
>
typename
boost
::
disable_if_c
<
boost
::
is_same
<
Range
,
OutputIterator
>::
value
,
OutputIterator
>::
type
clamp_range
(
const
Range
&
r
,
OutputIterator
out
,
typename
std
::
iterator_traits
<
typename
boost
::
range_iterator
<
const
Range
>::
type
>::
value_type
const
&
lo
,
typename
std
::
iterator_traits
<
typename
boost
::
range_iterator
<
const
Range
>::
type
>::
value_type
const
&
hi
)
{
return
clamp_range
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
out
,
lo
,
hi
);
}
/// \fn clamp_range ( InputIterator first, InputIterator last, OutputIterator out,
/// std::iterator_traits<InputIterator>::value_type const & lo,
/// std::iterator_traits<InputIterator>::value_type const & hi, Pred p )
/// \return clamp the sequence of values [first, last) into [ lo, hi ]
/// using the comparison predicate p.
///
/// \param first The start of the range of values
/// \param last One past the end of the range of input values
/// \param out An output iterator to write the clamped values into
/// \param lo The lower bound of the range to be clamped to
/// \param hi The upper bound of the range to be clamped to
/// \param p A predicate to use to compare the values.
/// p ( a, b ) returns a boolean.
///
template
<
typename
InputIterator
,
typename
OutputIterator
,
typename
Pred
>
OutputIterator
clamp_range
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
out
,
typename
std
::
iterator_traits
<
InputIterator
>::
value_type
const
&
lo
,
typename
std
::
iterator_traits
<
InputIterator
>::
value_type
const
&
hi
,
Pred
p
)
{
// this could also be written with bind and std::transform
while
(
first
!=
last
)
*
out
++
=
clamp
(
*
first
++
,
lo
,
hi
,
p
);
return
out
;
}
/// \fn clamp_range ( const Range &r, OutputIterator out,
/// typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type const & lo,
/// typename std::iterator_traits<typename boost::range_iterator<const Range>::type>::value_type const & hi,
/// Pred p )
/// \return clamp the sequence of values [first, last) into [ lo, hi ]
/// using the comparison predicate p.
///
/// \param r The range of values to be clamped
/// \param out An output iterator to write the clamped values into
/// \param lo The lower bound of the range to be clamped to
/// \param hi The upper bound of the range to be clamped to
/// \param p A predicate to use to compare the values.
/// p ( a, b ) returns a boolean.
//
// Disable this template if the first two parameters are the same type;
// In that case, the user will get the two iterator version.
template
<
typename
Range
,
typename
OutputIterator
,
typename
Pred
>
typename
boost
::
disable_if_c
<
boost
::
is_same
<
Range
,
OutputIterator
>::
value
,
OutputIterator
>::
type
clamp_range
(
const
Range
&
r
,
OutputIterator
out
,
typename
std
::
iterator_traits
<
typename
boost
::
range_iterator
<
const
Range
>::
type
>::
value_type
const
&
lo
,
typename
std
::
iterator_traits
<
typename
boost
::
range_iterator
<
const
Range
>::
type
>::
value_type
const
&
hi
,
Pred
p
)
{
return
clamp_range
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
out
,
lo
,
hi
,
p
);
}
}}
#endif // BOOST_ALGORITHM_CLAMP_HPP
assembler/ext/include/boost/algorithm/cxx11/all_of.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
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)
*/
/// \file all_of.hpp
/// \brief Test ranges to see if all elements match a value or predicate.
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_ALL_OF_HPP
#define BOOST_ALGORITHM_ALL_OF_HPP
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn all_of ( InputIterator first, InputIterator last, Predicate p )
/// \return true if all elements in [first, last) satisfy the predicate 'p'
/// \note returns true on an empty range
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param p A predicate for testing the elements of the sequence
///
/// \note This function is part of the C++2011 standard library.
template
<
typename
InputIterator
,
typename
Predicate
>
bool
all_of
(
InputIterator
first
,
InputIterator
last
,
Predicate
p
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
!
p
(
*
first
))
return
false
;
return
true
;
}
/// \fn all_of ( const Range &r, Predicate p )
/// \return true if all elements in the range satisfy the predicate 'p'
/// \note returns true on an empty range
///
/// \param r The input range
/// \param p A predicate for testing the elements of the range
///
template
<
typename
Range
,
typename
Predicate
>
bool
all_of
(
const
Range
&
r
,
Predicate
p
)
{
return
boost
::
algorithm
::
all_of
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
p
);
}
/// \fn all_of_equal ( InputIterator first, InputIterator last, const T &val )
/// \return true if all elements in [first, last) are equal to 'val'
/// \note returns true on an empty range
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param val A value to compare against
///
template
<
typename
InputIterator
,
typename
T
>
bool
all_of_equal
(
InputIterator
first
,
InputIterator
last
,
const
T
&
val
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
val
!=
*
first
)
return
false
;
return
true
;
}
/// \fn all_of_equal ( const Range &r, const T &val )
/// \return true if all elements in the range are equal to 'val'
/// \note returns true on an empty range
///
/// \param r The input range
/// \param val A value to compare against
///
template
<
typename
Range
,
typename
T
>
bool
all_of_equal
(
const
Range
&
r
,
const
T
&
val
)
{
return
boost
::
algorithm
::
all_of_equal
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
val
);
}
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_ALL_OF_HPP
assembler/ext/include/boost/algorithm/cxx11/any_of.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
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)
For more information, see http://www.boost.org
*/
/// \file
/// \brief Test ranges to see if any elements match a value or predicate.
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_ANY_OF_HPP
#define BOOST_ALGORITHM_ANY_OF_HPP
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn any_of ( InputIterator first, InputIterator last, Predicate p )
/// \return true if any of the elements in [first, last) satisfy the predicate
/// \note returns false on an empty range
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param p A predicate for testing the elements of the sequence
///
template
<
typename
InputIterator
,
typename
Predicate
>
bool
any_of
(
InputIterator
first
,
InputIterator
last
,
Predicate
p
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
p
(
*
first
))
return
true
;
return
false
;
}
/// \fn any_of ( const Range &r, Predicate p )
/// \return true if any elements in the range satisfy the predicate 'p'
/// \note returns false on an empty range
///
/// \param r The input range
/// \param p A predicate for testing the elements of the range
///
template
<
typename
Range
,
typename
Predicate
>
bool
any_of
(
const
Range
&
r
,
Predicate
p
)
{
return
boost
::
algorithm
::
any_of
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
p
);
}
/// \fn any_of_equal ( InputIterator first, InputIterator last, const V &val )
/// \return true if any of the elements in [first, last) are equal to 'val'
/// \note returns false on an empty range
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param val A value to compare against
///
template
<
typename
InputIterator
,
typename
V
>
bool
any_of_equal
(
InputIterator
first
,
InputIterator
last
,
const
V
&
val
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
val
==
*
first
)
return
true
;
return
false
;
}
/// \fn any_of_equal ( const Range &r, const V &val )
/// \return true if any of the elements in the range are equal to 'val'
/// \note returns false on an empty range
///
/// \param r The input range
/// \param val A value to compare against
///
template
<
typename
Range
,
typename
V
>
bool
any_of_equal
(
const
Range
&
r
,
const
V
&
val
)
{
return
boost
::
algorithm
::
any_of_equal
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
val
);
}
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_ANY_OF_HPP
assembler/ext/include/boost/algorithm/cxx11/copy_if.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
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)
*/
/// \file copy_if.hpp
/// \brief Copy a subset of a sequence to a new sequence
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_COPY_IF_HPP
#define BOOST_ALGORITHM_COPY_IF_HPP
#include
<utility>
// for std::pair, std::make_pair
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn copy_if ( InputIterator first, InputIterator last, OutputIterator result, Predicate p )
/// \brief Copies all the elements from the input range that satisfy the
/// predicate to the output range.
/// \return The updated output iterator
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param result An output iterator to write the results into
/// \param p A predicate for testing the elements of the range
/// \note This function is part of the C++2011 standard library.
template
<
typename
InputIterator
,
typename
OutputIterator
,
typename
Predicate
>
OutputIterator
copy_if
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
result
,
Predicate
p
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
p
(
*
first
))
*
result
++
=
*
first
;
return
result
;
}
/// \fn copy_if ( const Range &r, OutputIterator result, Predicate p )
/// \brief Copies all the elements from the input range that satisfy the
/// predicate to the output range.
/// \return The updated output iterator
///
/// \param r The input range
/// \param result An output iterator to write the results into
/// \param p A predicate for testing the elements of the range
///
template
<
typename
Range
,
typename
OutputIterator
,
typename
Predicate
>
OutputIterator
copy_if
(
const
Range
&
r
,
OutputIterator
result
,
Predicate
p
)
{
return
boost
::
algorithm
::
copy_if
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
result
,
p
);
}
/// \fn copy_while ( InputIterator first, InputIterator last, OutputIterator result, Predicate p )
/// \brief Copies all the elements at the start of the input range that
/// satisfy the predicate to the output range.
/// \return The updated input and output iterators
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param result An output iterator to write the results into
/// \param p A predicate for testing the elements of the range
///
template
<
typename
InputIterator
,
typename
OutputIterator
,
typename
Predicate
>
std
::
pair
<
InputIterator
,
OutputIterator
>
copy_while
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
result
,
Predicate
p
)
{
for
(
;
first
!=
last
&&
p
(
*
first
);
++
first
)
*
result
++
=
*
first
;
return
std
::
make_pair
(
first
,
result
);
}
/// \fn copy_while ( const Range &r, OutputIterator result, Predicate p )
/// \brief Copies all the elements at the start of the input range that
/// satisfy the predicate to the output range.
/// \return The updated input and output iterators
///
/// \param r The input range
/// \param result An output iterator to write the results into
/// \param p A predicate for testing the elements of the range
///
template
<
typename
Range
,
typename
OutputIterator
,
typename
Predicate
>
std
::
pair
<
typename
boost
::
range_iterator
<
const
Range
>::
type
,
OutputIterator
>
copy_while
(
const
Range
&
r
,
OutputIterator
result
,
Predicate
p
)
{
return
boost
::
algorithm
::
copy_while
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
result
,
p
);
}
/// \fn copy_until ( InputIterator first, InputIterator last, OutputIterator result, Predicate p )
/// \brief Copies all the elements at the start of the input range that do not
/// satisfy the predicate to the output range.
/// \return The updated output iterator
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param result An output iterator to write the results into
/// \param p A predicate for testing the elements of the range
///
template
<
typename
InputIterator
,
typename
OutputIterator
,
typename
Predicate
>
std
::
pair
<
InputIterator
,
OutputIterator
>
copy_until
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
result
,
Predicate
p
)
{
for
(
;
first
!=
last
&&
!
p
(
*
first
);
++
first
)
*
result
++
=
*
first
;
return
std
::
make_pair
(
first
,
result
);
}
/// \fn copy_until ( const Range &r, OutputIterator result, Predicate p )
/// \brief Copies all the elements at the start of the input range that do not
/// satisfy the predicate to the output range.
/// \return The updated output iterator
///
/// \param r The input range
/// \param result An output iterator to write the results into
/// \param p A predicate for testing the elements of the range
///
template
<
typename
Range
,
typename
OutputIterator
,
typename
Predicate
>
std
::
pair
<
typename
boost
::
range_iterator
<
const
Range
>::
type
,
OutputIterator
>
copy_until
(
const
Range
&
r
,
OutputIterator
result
,
Predicate
p
)
{
return
boost
::
algorithm
::
copy_until
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
result
,
p
);
}
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_COPY_IF_HPP
assembler/ext/include/boost/algorithm/cxx11/copy_n.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2011-2012.
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)
*/
/// \file copy_n.hpp
/// \brief Copy n items from one sequence to another
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_COPY_N_HPP
#define BOOST_ALGORITHM_COPY_N_HPP
namespace
boost
{
namespace
algorithm
{
/// \fn copy_n ( InputIterator first, Size n, OutputIterator result )
/// \brief Copies exactly n (n > 0) elements from the range starting at first to
/// the range starting at result.
/// \return The updated output iterator
///
/// \param first The start of the input sequence
/// \param n The number of elements to copy
/// \param result An output iterator to write the results into
/// \note This function is part of the C++2011 standard library.
template
<
typename
InputIterator
,
typename
Size
,
typename
OutputIterator
>
OutputIterator
copy_n
(
InputIterator
first
,
Size
n
,
OutputIterator
result
)
{
for
(
;
n
>
0
;
--
n
,
++
first
,
++
result
)
*
result
=
*
first
;
return
result
;
}
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_COPY_IF_HPP
assembler/ext/include/boost/algorithm/cxx11/find_if_not.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2011-2012.
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)
*/
/// \file find_if_not.hpp
/// \brief Find the first element in a sequence that does not satisfy a predicate.
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_FIND_IF_NOT_HPP
#define BOOST_ALGORITHM_FIND_IF_NOT_HPP
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn find_if_not(InputIterator first, InputIterator last, Predicate p)
/// \brief Finds the first element in the sequence that does not satisfy the predicate.
/// \return The iterator pointing to the desired element.
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param p A predicate for testing the elements of the range
/// \note This function is part of the C++2011 standard library.
template
<
typename
InputIterator
,
typename
Predicate
>
InputIterator
find_if_not
(
InputIterator
first
,
InputIterator
last
,
Predicate
p
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
!
p
(
*
first
))
break
;
return
first
;
}
/// \fn find_if_not ( const Range &r, Predicate p )
/// \brief Finds the first element in the sequence that does not satisfy the predicate.
/// \return The iterator pointing to the desired element.
///
/// \param r The input range
/// \param p A predicate for testing the elements of the range
///
template
<
typename
Range
,
typename
Predicate
>
typename
boost
::
range_iterator
<
const
Range
>::
type
find_if_not
(
const
Range
&
r
,
Predicate
p
)
{
return
boost
::
algorithm
::
find_if_not
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
p
);
}
}}
#endif // BOOST_ALGORITHM_FIND_IF_NOT_HPP
assembler/ext/include/boost/algorithm/cxx11/iota.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
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)
*/
/// \file iota.hpp
/// \brief Generate an increasing series
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_IOTA_HPP
#define BOOST_ALGORITHM_IOTA_HPP
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn iota ( ForwardIterator first, ForwardIterator last, T value )
/// \brief Generates an increasing sequence of values, and stores them in [first, last)
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param value The initial value of the sequence to be generated
/// \note This function is part of the C++2011 standard library.
template
<
typename
ForwardIterator
,
typename
T
>
void
iota
(
ForwardIterator
first
,
ForwardIterator
last
,
T
value
)
{
for
(
;
first
!=
last
;
++
first
,
++
value
)
*
first
=
value
;
}
/// \fn iota ( Range &r, T value )
/// \brief Generates an increasing sequence of values, and stores them in the input Range.
///
/// \param r The input range
/// \param value The initial value of the sequence to be generated
///
template
<
typename
Range
,
typename
T
>
void
iota
(
Range
&
r
,
T
value
)
{
boost
::
algorithm
::
iota
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
value
);
}
/// \fn iota_n ( OutputIterator out, T value, std::size_t n )
/// \brief Generates an increasing sequence of values, and stores them in the input Range.
///
/// \param out An output iterator to write the results into
/// \param value The initial value of the sequence to be generated
/// \param n The number of items to write
///
template
<
typename
OutputIterator
,
typename
T
>
OutputIterator
iota_n
(
OutputIterator
out
,
T
value
,
std
::
size_t
n
)
{
for
(
;
n
>
0
;
--
n
,
++
value
)
*
out
++
=
value
;
return
out
;
}
}}
#endif // BOOST_ALGORITHM_IOTA_HPP
assembler/ext/include/boost/algorithm/cxx11/is_partitioned.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2011-2012.
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)
*/
/// \file is_partitioned.hpp
/// \brief Tell if a sequence is partitioned
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_IS_PARTITIONED_HPP
#define BOOST_ALGORITHM_IS_PARTITIONED_HPP
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn is_partitioned ( InputIterator first, InputIterator last, UnaryPredicate p )
/// \brief Tests to see if a sequence is partitioned according to a predicate
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param p The predicate to test the values with
/// \note This function is part of the C++2011 standard library.
template
<
typename
InputIterator
,
typename
UnaryPredicate
>
bool
is_partitioned
(
InputIterator
first
,
InputIterator
last
,
UnaryPredicate
p
)
{
// Run through the part that satisfy the predicate
for
(
;
first
!=
last
;
++
first
)
if
(
!
p
(
*
first
))
break
;
// Now the part that does not satisfy the predicate
for
(
;
first
!=
last
;
++
first
)
if
(
p
(
*
first
))
return
false
;
return
true
;
}
/// \fn is_partitioned ( const Range &r, UnaryPredicate p )
/// \brief Generates an increasing sequence of values, and stores them in the input Range.
///
/// \param r The input range
/// \param p The predicate to test the values with
///
template
<
typename
Range
,
typename
UnaryPredicate
>
bool
is_partitioned
(
const
Range
&
r
,
UnaryPredicate
p
)
{
return
boost
::
algorithm
::
is_partitioned
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
p
);
}
}}
#endif // BOOST_ALGORITHM_IS_PARTITIONED_HPP
assembler/ext/include/boost/algorithm/cxx11/is_permutation.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2011-2012.
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)
*/
/// \file is_permutation.hpp
/// \brief Is a sequence a permutation of another sequence
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_IS_PERMUTATION11_HPP
#define BOOST_ALGORITHM_IS_PERMUTATION11_HPP
#include
<algorithm>
// for std::find_if, count_if, mismatch
#include
<utility>
// for std::pair
#include
<functional>
// for std::equal_to
#include
<iterator>
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
#include
<boost/utility/enable_if.hpp>
#include
<boost/type_traits/is_same.hpp>
namespace
boost
{
namespace
algorithm
{
/// \cond DOXYGEN_HIDE
namespace
detail
{
template
<
typename
Predicate
,
typename
Iterator
>
struct
value_predicate
{
value_predicate
(
Predicate
p
,
Iterator
it
)
:
p_
(
p
),
it_
(
it
)
{}
template
<
typename
T1
>
bool
operator
()
(
const
T1
&
t1
)
const
{
return
p_
(
*
it_
,
t1
);
}
private
:
Predicate
p_
;
Iterator
it_
;
};
// Preconditions:
// 1. The sequences are the same length
// 2. Any common elements on the front have been removed (not necessary for correctness, just for performance)
template
<
class
ForwardIterator1
,
class
ForwardIterator2
,
class
BinaryPredicate
>
bool
is_permutation_inner
(
ForwardIterator1
first1
,
ForwardIterator1
last1
,
ForwardIterator2
first2
,
ForwardIterator2
last2
,
BinaryPredicate
p
)
{
// for each unique value in the sequence [first1,last1), count how many times
// it occurs, and make sure it occurs the same number of times in [first2, last2)
for
(
ForwardIterator1
iter
=
first1
;
iter
!=
last1
;
++
iter
)
{
value_predicate
<
BinaryPredicate
,
ForwardIterator1
>
pred
(
p
,
iter
);
/* For each value we haven't seen yet... */
if
(
std
::
find_if
(
first1
,
iter
,
pred
)
==
iter
)
{
std
::
size_t
dest_count
=
std
::
count_if
(
first2
,
last2
,
pred
);
if
(
dest_count
==
0
||
dest_count
!=
(
std
::
size_t
)
std
::
count_if
(
iter
,
last1
,
pred
))
return
false
;
}
}
return
true
;
}
template
<
class
ForwardIterator1
,
class
ForwardIterator2
,
class
BinaryPredicate
>
bool
is_permutation_tag
(
ForwardIterator1
first1
,
ForwardIterator1
last1
,
ForwardIterator2
first2
,
ForwardIterator2
last2
,
BinaryPredicate
p
,
std
::
forward_iterator_tag
,
std
::
forward_iterator_tag
)
{
// Skip the common prefix (if any)
while
(
first1
!=
last1
&&
first2
!=
last2
&&
p
(
*
first1
,
*
first2
))
{
++
first1
;
++
first2
;
}
if
(
first1
!=
last1
&&
first2
!=
last2
)
return
boost
::
algorithm
::
detail
::
is_permutation_inner
(
first1
,
last1
,
first2
,
last2
,
std
::
equal_to
<
typename
std
::
iterator_traits
<
ForwardIterator1
>::
value_type
>
());
return
first1
==
last1
&&
first2
==
last2
;
}
template
<
class
RandomAccessIterator1
,
class
RandomAccessIterator2
,
class
BinaryPredicate
>
bool
is_permutation_tag
(
RandomAccessIterator1
first1
,
RandomAccessIterator1
last1
,
RandomAccessIterator2
first2
,
RandomAccessIterator2
last2
,
BinaryPredicate
p
,
std
::
random_access_iterator_tag
,
std
::
random_access_iterator_tag
)
{
// Cheap check
if
(
std
::
distance
(
first1
,
last1
)
!=
std
::
distance
(
first2
,
last2
))
return
false
;
// Skip the common prefix (if any)
while
(
first1
!=
last1
&&
first2
!=
last2
&&
p
(
*
first1
,
*
first2
))
{
++
first1
;
++
first2
;
}
if
(
first1
!=
last1
&&
first2
!=
last2
)
return
is_permutation_inner
(
first1
,
last1
,
first2
,
last2
,
p
);
return
first1
==
last1
&&
first2
==
last2
;
}
}
/// \endcond
/// \fn is_permutation ( ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 first2, BinaryPredicate p )
/// \brief Tests to see if the sequence [first,last) is a permutation of the sequence starting at first2
///
/// \param first1 The start of the input sequence
/// \param last1 One past the end of the input sequence
/// \param first2 The start of the second sequence
/// \param p The predicate to compare elements with
///
/// \note This function is part of the C++2011 standard library.
template
<
class
ForwardIterator1
,
class
ForwardIterator2
,
class
BinaryPredicate
>
bool
is_permutation
(
ForwardIterator1
first1
,
ForwardIterator1
last1
,
ForwardIterator2
first2
,
BinaryPredicate
p
)
{
// Skip the common prefix (if any)
std
::
pair
<
ForwardIterator1
,
ForwardIterator2
>
eq
=
std
::
mismatch
(
first1
,
last1
,
first2
,
p
);
first1
=
eq
.
first
;
first2
=
eq
.
second
;
if
(
first1
!=
last1
)
{
// Create last2
ForwardIterator2
last2
=
first2
;
std
::
advance
(
last2
,
std
::
distance
(
first1
,
last1
));
return
boost
::
algorithm
::
detail
::
is_permutation_inner
(
first1
,
last1
,
first2
,
last2
,
p
);
}
return
true
;
}
/// \fn is_permutation ( ForwardIterator1 first, ForwardIterator1 last, ForwardIterator2 first2 )
/// \brief Tests to see if the sequence [first,last) is a permutation of the sequence starting at first2
///
/// \param first1 The start of the input sequence
/// \param last2 One past the end of the input sequence
/// \param first2 The start of the second sequence
/// \note This function is part of the C++2011 standard library.
template
<
class
ForwardIterator1
,
class
ForwardIterator2
>
bool
is_permutation
(
ForwardIterator1
first1
,
ForwardIterator1
last1
,
ForwardIterator2
first2
)
{
// How should I deal with the idea that ForwardIterator1::value_type
// and ForwardIterator2::value_type could be different? Define my own comparison predicate?
// Skip the common prefix (if any)
std
::
pair
<
ForwardIterator1
,
ForwardIterator2
>
eq
=
std
::
mismatch
(
first1
,
last1
,
first2
);
first1
=
eq
.
first
;
first2
=
eq
.
second
;
if
(
first1
!=
last1
)
{
// Create last2
ForwardIterator2
last2
=
first2
;
std
::
advance
(
last2
,
std
::
distance
(
first1
,
last1
));
return
boost
::
algorithm
::
detail
::
is_permutation_inner
(
first1
,
last1
,
first2
,
last2
,
std
::
equal_to
<
typename
std
::
iterator_traits
<
ForwardIterator1
>::
value_type
>
());
}
return
true
;
}
/// \fn is_permutation ( const Range &r, ForwardIterator first2 )
/// \brief Tests to see if the sequence [first,last) is a permutation of the sequence starting at first2
///
/// \param r The input range
/// \param first2 The start of the second sequence
template
<
typename
Range
,
typename
ForwardIterator
>
bool
is_permutation
(
const
Range
&
r
,
ForwardIterator
first2
)
{
return
boost
::
algorithm
::
is_permutation
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
first2
);
}
/// \fn is_permutation ( const Range &r, ForwardIterator first2, BinaryPredicate pred )
/// \brief Tests to see if the sequence [first,last) is a permutation of the sequence starting at first2
///
/// \param r The input range
/// \param first2 The start of the second sequence
/// \param pred The predicate to compare elements with
///
// Disable this template when the first two parameters are the same type
// That way the non-range version will be chosen.
template
<
typename
Range
,
typename
ForwardIterator
,
typename
BinaryPredicate
>
typename
boost
::
disable_if_c
<
boost
::
is_same
<
Range
,
ForwardIterator
>::
value
,
bool
>::
type
is_permutation
(
const
Range
&
r
,
ForwardIterator
first2
,
BinaryPredicate
pred
)
{
return
boost
::
algorithm
::
is_permutation
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
first2
,
pred
);
}
}}
#endif // BOOST_ALGORITHM_IS_PERMUTATION11_HPP
assembler/ext/include/boost/algorithm/cxx11/is_sorted.hpp
deleted
100644 → 0
View file @
05939cac
// Copyright (c) 2010 Nuovation System Designs, LLC
// Grant Erickson <gerickson@nuovations.com>
//
// Reworked somewhat by Marshall Clow; August 2010
//
// 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/ for latest version.
//
#ifndef BOOST_ALGORITHM_ORDERED_HPP
#define BOOST_ALGORITHM_ORDERED_HPP
#include
<functional>
#include
<iterator>
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
#include
<boost/utility/enable_if.hpp>
#include
<boost/type_traits/is_same.hpp>
#include
<boost/mpl/identity.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn is_sorted_until ( ForwardIterator first, ForwardIterator last, Pred p )
/// \return the point in the sequence [first, last) where the elements are unordered
/// (according to the comparison predicate 'p').
///
/// \param first The start of the sequence to be tested.
/// \param last One past the end of the sequence
/// \param p A binary predicate that returns true if two elements are ordered.
///
template
<
typename
ForwardIterator
,
typename
Pred
>
ForwardIterator
is_sorted_until
(
ForwardIterator
first
,
ForwardIterator
last
,
Pred
p
)
{
if
(
first
==
last
)
return
last
;
// the empty sequence is ordered
ForwardIterator
next
=
first
;
while
(
++
next
!=
last
)
{
if
(
p
(
*
next
,
*
first
))
return
next
;
first
=
next
;
}
return
last
;
}
/// \fn is_sorted_until ( ForwardIterator first, ForwardIterator last )
/// \return the point in the sequence [first, last) where the elements are unordered
///
/// \param first The start of the sequence to be tested.
/// \param last One past the end of the sequence
///
template
<
typename
ForwardIterator
>
ForwardIterator
is_sorted_until
(
ForwardIterator
first
,
ForwardIterator
last
)
{
typedef
typename
std
::
iterator_traits
<
ForwardIterator
>::
value_type
value_type
;
return
boost
::
algorithm
::
is_sorted_until
(
first
,
last
,
std
::
less
<
value_type
>
());
}
/// \fn is_sorted ( ForwardIterator first, ForwardIterator last, Pred p )
/// \return whether or not the entire sequence is sorted
///
/// \param first The start of the sequence to be tested.
/// \param last One past the end of the sequence
/// \param p A binary predicate that returns true if two elements are ordered.
///
template
<
typename
ForwardIterator
,
typename
Pred
>
bool
is_sorted
(
ForwardIterator
first
,
ForwardIterator
last
,
Pred
p
)
{
return
boost
::
algorithm
::
is_sorted_until
(
first
,
last
,
p
)
==
last
;
}
/// \fn is_sorted ( ForwardIterator first, ForwardIterator last )
/// \return whether or not the entire sequence is sorted
///
/// \param first The start of the sequence to be tested.
/// \param last One past the end of the sequence
///
template
<
typename
ForwardIterator
>
bool
is_sorted
(
ForwardIterator
first
,
ForwardIterator
last
)
{
return
boost
::
algorithm
::
is_sorted_until
(
first
,
last
)
==
last
;
}
///
/// -- Range based versions of the C++11 functions
///
/// \fn is_sorted_until ( const R &range, Pred p )
/// \return the point in the range R where the elements are unordered
/// (according to the comparison predicate 'p').
///
/// \param range The range to be tested.
/// \param p A binary predicate that returns true if two elements are ordered.
///
template
<
typename
R
,
typename
Pred
>
typename
boost
::
lazy_disable_if_c
<
boost
::
is_same
<
R
,
Pred
>::
value
,
typename
boost
::
range_iterator
<
const
R
>
>::
type
is_sorted_until
(
const
R
&
range
,
Pred
p
)
{
return
boost
::
algorithm
::
is_sorted_until
(
boost
::
begin
(
range
),
boost
::
end
(
range
),
p
);
}
/// \fn is_sorted_until ( const R &range )
/// \return the point in the range R where the elements are unordered
///
/// \param range The range to be tested.
///
template
<
typename
R
>
typename
boost
::
range_iterator
<
const
R
>::
type
is_sorted_until
(
const
R
&
range
)
{
return
boost
::
algorithm
::
is_sorted_until
(
boost
::
begin
(
range
),
boost
::
end
(
range
));
}
/// \fn is_sorted ( const R &range, Pred p )
/// \return whether or not the entire range R is sorted
/// (according to the comparison predicate 'p').
///
/// \param range The range to be tested.
/// \param p A binary predicate that returns true if two elements are ordered.
///
template
<
typename
R
,
typename
Pred
>
typename
boost
::
lazy_disable_if_c
<
boost
::
is_same
<
R
,
Pred
>::
value
,
boost
::
mpl
::
identity
<
bool
>
>::
type
is_sorted
(
const
R
&
range
,
Pred
p
)
{
return
boost
::
algorithm
::
is_sorted
(
boost
::
begin
(
range
),
boost
::
end
(
range
),
p
);
}
/// \fn is_sorted ( const R &range )
/// \return whether or not the entire range R is sorted
///
/// \param range The range to be tested.
///
template
<
typename
R
>
bool
is_sorted
(
const
R
&
range
)
{
return
boost
::
algorithm
::
is_sorted
(
boost
::
begin
(
range
),
boost
::
end
(
range
));
}
///
/// -- Range based versions of the C++11 functions
///
/// \fn is_increasing ( ForwardIterator first, ForwardIterator last )
/// \return true if the entire sequence is increasing; i.e, each item is greater than or
/// equal to the previous one.
///
/// \param first The start of the sequence to be tested.
/// \param last One past the end of the sequence
///
/// \note This function will return true for sequences that contain items that compare
/// equal. If that is not what you intended, you should use is_strictly_increasing instead.
template
<
typename
ForwardIterator
>
bool
is_increasing
(
ForwardIterator
first
,
ForwardIterator
last
)
{
typedef
typename
std
::
iterator_traits
<
ForwardIterator
>::
value_type
value_type
;
return
boost
::
algorithm
::
is_sorted
(
first
,
last
,
std
::
less
<
value_type
>
());
}
/// \fn is_increasing ( const R &range )
/// \return true if the entire sequence is increasing; i.e, each item is greater than or
/// equal to the previous one.
///
/// \param range The range to be tested.
///
/// \note This function will return true for sequences that contain items that compare
/// equal. If that is not what you intended, you should use is_strictly_increasing instead.
template
<
typename
R
>
bool
is_increasing
(
const
R
&
range
)
{
return
is_increasing
(
boost
::
begin
(
range
),
boost
::
end
(
range
));
}
/// \fn is_decreasing ( ForwardIterator first, ForwardIterator last )
/// \return true if the entire sequence is decreasing; i.e, each item is less than
/// or equal to the previous one.
///
/// \param first The start of the sequence to be tested.
/// \param last One past the end of the sequence
///
/// \note This function will return true for sequences that contain items that compare
/// equal. If that is not what you intended, you should use is_strictly_decreasing instead.
template
<
typename
ForwardIterator
>
bool
is_decreasing
(
ForwardIterator
first
,
ForwardIterator
last
)
{
typedef
typename
std
::
iterator_traits
<
ForwardIterator
>::
value_type
value_type
;
return
boost
::
algorithm
::
is_sorted
(
first
,
last
,
std
::
greater
<
value_type
>
());
}
/// \fn is_decreasing ( const R &range )
/// \return true if the entire sequence is decreasing; i.e, each item is less than
/// or equal to the previous one.
///
/// \param range The range to be tested.
///
/// \note This function will return true for sequences that contain items that compare
/// equal. If that is not what you intended, you should use is_strictly_decreasing instead.
template
<
typename
R
>
bool
is_decreasing
(
const
R
&
range
)
{
return
is_decreasing
(
boost
::
begin
(
range
),
boost
::
end
(
range
));
}
/// \fn is_strictly_increasing ( ForwardIterator first, ForwardIterator last )
/// \return true if the entire sequence is strictly increasing; i.e, each item is greater
/// than the previous one
///
/// \param first The start of the sequence to be tested.
/// \param last One past the end of the sequence
///
/// \note This function will return false for sequences that contain items that compare
/// equal. If that is not what you intended, you should use is_increasing instead.
template
<
typename
ForwardIterator
>
bool
is_strictly_increasing
(
ForwardIterator
first
,
ForwardIterator
last
)
{
typedef
typename
std
::
iterator_traits
<
ForwardIterator
>::
value_type
value_type
;
return
boost
::
algorithm
::
is_sorted
(
first
,
last
,
std
::
less_equal
<
value_type
>
());
}
/// \fn is_strictly_increasing ( const R &range )
/// \return true if the entire sequence is strictly increasing; i.e, each item is greater
/// than the previous one
///
/// \param range The range to be tested.
///
/// \note This function will return false for sequences that contain items that compare
/// equal. If that is not what you intended, you should use is_increasing instead.
template
<
typename
R
>
bool
is_strictly_increasing
(
const
R
&
range
)
{
return
is_strictly_increasing
(
boost
::
begin
(
range
),
boost
::
end
(
range
));
}
/// \fn is_strictly_decreasing ( ForwardIterator first, ForwardIterator last )
/// \return true if the entire sequence is strictly decreasing; i.e, each item is less than
/// the previous one
///
/// \param first The start of the sequence to be tested.
/// \param last One past the end of the sequence
///
/// \note This function will return false for sequences that contain items that compare
/// equal. If that is not what you intended, you should use is_decreasing instead.
template
<
typename
ForwardIterator
>
bool
is_strictly_decreasing
(
ForwardIterator
first
,
ForwardIterator
last
)
{
typedef
typename
std
::
iterator_traits
<
ForwardIterator
>::
value_type
value_type
;
return
boost
::
algorithm
::
is_sorted
(
first
,
last
,
std
::
greater_equal
<
value_type
>
());
}
/// \fn is_strictly_decreasing ( const R &range )
/// \return true if the entire sequence is strictly decreasing; i.e, each item is less than
/// the previous one
///
/// \param range The range to be tested.
///
/// \note This function will return false for sequences that contain items that compare
/// equal. If that is not what you intended, you should use is_decreasing instead.
template
<
typename
R
>
bool
is_strictly_decreasing
(
const
R
&
range
)
{
return
is_strictly_decreasing
(
boost
::
begin
(
range
),
boost
::
end
(
range
));
}
}}
// namespace boost
#endif // BOOST_ALGORITHM_ORDERED_HPP
assembler/ext/include/boost/algorithm/cxx11/none_of.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
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)
*/
/// \file none_of.hpp
/// \brief Test ranges to see if no elements match a value or predicate.
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_NONE_OF_HPP
#define BOOST_ALGORITHM_NONE_OF_HPP
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn none_of ( InputIterator first, InputIterator last, Predicate p )
/// \return true if none of the elements in [first, last) satisfy the predicate 'p'
/// \note returns true on an empty range
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param p A predicate for testing the elements of the sequence
///
template
<
typename
InputIterator
,
typename
Predicate
>
bool
none_of
(
InputIterator
first
,
InputIterator
last
,
Predicate
p
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
p
(
*
first
))
return
false
;
return
true
;
}
/// \fn none_of ( const Range &r, Predicate p )
/// \return true if none of the elements in the range satisfy the predicate 'p'
/// \note returns true on an empty range
///
/// \param r The input range
/// \param p A predicate for testing the elements of the range
///
template
<
typename
Range
,
typename
Predicate
>
bool
none_of
(
const
Range
&
r
,
Predicate
p
)
{
return
boost
::
algorithm
::
none_of
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
p
);
}
/// \fn none_of_equal ( InputIterator first, InputIterator last, const V &val )
/// \return true if none of the elements in [first, last) are equal to 'val'
/// \note returns true on an empty range
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param val A value to compare against
///
template
<
typename
InputIterator
,
typename
V
>
bool
none_of_equal
(
InputIterator
first
,
InputIterator
last
,
const
V
&
val
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
val
==
*
first
)
return
false
;
return
true
;
}
/// \fn none_of_equal ( const Range &r, const V &val )
/// \return true if none of the elements in the range are equal to 'val'
/// \note returns true on an empty range
///
/// \param r The input range
/// \param val A value to compare against
///
template
<
typename
Range
,
typename
V
>
bool
none_of_equal
(
const
Range
&
r
,
const
V
&
val
)
{
return
boost
::
algorithm
::
none_of_equal
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
val
);
}
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_NONE_OF_HPP
assembler/ext/include/boost/algorithm/cxx11/one_of.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
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)
*/
/// \file one_of.hpp
/// \brief Test ranges to see if only one element matches a value or predicate.
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_ONE_OF_HPP
#define BOOST_ALGORITHM_ONE_OF_HPP
#include
<algorithm>
// for std::find and std::find_if
#include
<boost/algorithm/cxx11/none_of.hpp>
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn one_of ( InputIterator first, InputIterator last, Predicate p )
/// \return true if the predicate 'p' is true for exactly one item in [first, last).
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param p A predicate for testing the elements of the sequence
///
template
<
typename
InputIterator
,
typename
Predicate
>
bool
one_of
(
InputIterator
first
,
InputIterator
last
,
Predicate
p
)
{
InputIterator
i
=
std
::
find_if
(
first
,
last
,
p
);
if
(
i
==
last
)
return
false
;
// Didn't occur at all
return
boost
::
algorithm
::
none_of
(
++
i
,
last
,
p
);
}
/// \fn one_of ( const Range &r, Predicate p )
/// \return true if the predicate 'p' is true for exactly one item in the range.
///
/// \param r The input range
/// \param p A predicate for testing the elements of the range
///
template
<
typename
Range
,
typename
Predicate
>
bool
one_of
(
const
Range
&
r
,
Predicate
p
)
{
return
boost
::
algorithm
::
one_of
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
p
);
}
/// \fn one_of_equal ( InputIterator first, InputIterator last, const V &val )
/// \return true if the value 'val' exists only once in [first, last).
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param val A value to compare against
///
template
<
typename
InputIterator
,
typename
V
>
bool
one_of_equal
(
InputIterator
first
,
InputIterator
last
,
const
V
&
val
)
{
InputIterator
i
=
std
::
find
(
first
,
last
,
val
);
// find first occurrence of 'val'
if
(
i
==
last
)
return
false
;
// Didn't occur at all
return
boost
::
algorithm
::
none_of_equal
(
++
i
,
last
,
val
);
}
/// \fn one_of_equal ( const Range &r, const V &val )
/// \return true if the value 'val' exists only once in the range.
///
/// \param r The input range
/// \param val A value to compare against
///
template
<
typename
Range
,
typename
V
>
bool
one_of_equal
(
const
Range
&
r
,
const
V
&
val
)
{
return
boost
::
algorithm
::
one_of_equal
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
val
);
}
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_ALL_HPP
assembler/ext/include/boost/algorithm/cxx11/partition_copy.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2011-2012.
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)
*/
/// \file partition_copy.hpp
/// \brief Copy a subset of a sequence to a new sequence
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_PARTITION_COPY_HPP
#define BOOST_ALGORITHM_PARTITION_COPY_HPP
#include
<utility>
// for std::pair
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn partition_copy ( InputIterator first, InputIterator last,
/// OutputIterator1 out_true, OutputIterator2 out_false, UnaryPredicate p )
/// \brief Copies the elements that satisfy the predicate p from the range [first, last)
/// to the range beginning at d_first_true, and
/// copies the elements that do not satisfy p to the range beginning at d_first_false.
///
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param out_true An output iterator to write the elements that satisfy the predicate into
/// \param out_false An output iterator to write the elements that do not satisfy the predicate into
/// \param p A predicate for dividing the elements of the input sequence.
///
/// \note This function is part of the C++2011 standard library.
template
<
typename
InputIterator
,
typename
OutputIterator1
,
typename
OutputIterator2
,
typename
UnaryPredicate
>
std
::
pair
<
OutputIterator1
,
OutputIterator2
>
partition_copy
(
InputIterator
first
,
InputIterator
last
,
OutputIterator1
out_true
,
OutputIterator2
out_false
,
UnaryPredicate
p
)
{
for
(
;
first
!=
last
;
++
first
)
if
(
p
(
*
first
))
*
out_true
++
=
*
first
;
else
*
out_false
++
=
*
first
;
return
std
::
pair
<
OutputIterator1
,
OutputIterator2
>
(
out_true
,
out_false
);
}
/// \fn partition_copy ( const Range &r,
/// OutputIterator1 out_true, OutputIterator2 out_false, UnaryPredicate p )
///
/// \param r The input range
/// \param out_true An output iterator to write the elements that satisfy the predicate into
/// \param out_false An output iterator to write the elements that do not satisfy the predicate into
/// \param p A predicate for dividing the elements of the input sequence.
///
template
<
typename
Range
,
typename
OutputIterator1
,
typename
OutputIterator2
,
typename
UnaryPredicate
>
std
::
pair
<
OutputIterator1
,
OutputIterator2
>
partition_copy
(
const
Range
&
r
,
OutputIterator1
out_true
,
OutputIterator2
out_false
,
UnaryPredicate
p
)
{
return
boost
::
algorithm
::
partition_copy
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
out_true
,
out_false
,
p
);
}
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_PARTITION_COPY_HPP
assembler/ext/include/boost/algorithm/cxx11/partition_point.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2011-2012.
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)
*/
/// \file partition_point.hpp
/// \brief Find the partition point in a sequence
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_PARTITION_POINT_HPP
#define BOOST_ALGORITHM_PARTITION_POINT_HPP
#include
<iterator>
// for std::distance, advance
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn partition_point ( ForwardIterator first, ForwardIterator last, Predicate p )
/// \brief Given a partitioned range, returns the partition point, i.e, the first element
/// that does not satisfy p
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param p The predicate to test the values with
/// \note This function is part of the C++2011 standard library.
template
<
typename
ForwardIterator
,
typename
Predicate
>
ForwardIterator
partition_point
(
ForwardIterator
first
,
ForwardIterator
last
,
Predicate
p
)
{
std
::
size_t
dist
=
std
::
distance
(
first
,
last
);
while
(
first
!=
last
)
{
std
::
size_t
d2
=
dist
/
2
;
ForwardIterator
ret_val
=
first
;
std
::
advance
(
ret_val
,
d2
);
if
(
p
(
*
ret_val
))
{
first
=
++
ret_val
;
dist
-=
d2
+
1
;
}
else
{
last
=
ret_val
;
dist
=
d2
;
}
}
return
first
;
}
/// \fn partition_point ( Range &r, Predicate p )
/// \brief Given a partitioned range, returns the partition point
///
/// \param r The input range
/// \param p The predicate to test the values with
///
template
<
typename
Range
,
typename
Predicate
>
typename
boost
::
range_iterator
<
Range
>::
type
partition_point
(
Range
&
r
,
Predicate
p
)
{
return
boost
::
algorithm
::
partition_point
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
p
);
}
}}
#endif // BOOST_ALGORITHM_PARTITION_POINT_HPP
assembler/ext/include/boost/algorithm/cxx14/equal.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
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)
*/
/// \file equal.hpp
/// \brief Test ranges to if they are equal
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_EQUAL_HPP
#define BOOST_ALGORITHM_EQUAL_HPP
#include
<algorithm>
// for std::equal
#include
<functional>
// for std::binary_function
#include
<iterator>
namespace
boost
{
namespace
algorithm
{
namespace
detail
{
template
<
class
T1
,
class
T2
>
struct
eq
:
public
std
::
binary_function
<
T1
,
T2
,
bool
>
{
bool
operator
()
(
const
T1
&
v1
,
const
T2
&
v2
)
const
{
return
v1
==
v2
;}
};
template
<
class
RandomAccessIterator1
,
class
RandomAccessIterator2
,
class
BinaryPredicate
>
bool
equal
(
RandomAccessIterator1
first1
,
RandomAccessIterator1
last1
,
RandomAccessIterator2
first2
,
RandomAccessIterator2
last2
,
BinaryPredicate
pred
,
std
::
random_access_iterator_tag
,
std
::
random_access_iterator_tag
)
{
// Random-access iterators let is check the sizes in constant time
if
(
std
::
distance
(
first1
,
last1
)
!=
std
::
distance
(
first2
,
last2
))
return
false
;
// If we know that the sequences are the same size, the original version is fine
return
std
::
equal
(
first1
,
last1
,
first2
,
pred
);
}
template
<
class
InputIterator1
,
class
InputIterator2
,
class
BinaryPredicate
>
bool
equal
(
InputIterator1
first1
,
InputIterator1
last1
,
InputIterator2
first2
,
InputIterator2
last2
,
BinaryPredicate
pred
,
std
::
input_iterator_tag
,
std
::
input_iterator_tag
)
{
for
(;
first1
!=
last1
&&
first2
!=
last2
;
++
first1
,
++
first2
)
if
(
!
pred
(
*
first1
,
*
first2
))
return
false
;
return
first1
==
last1
&&
first2
==
last2
;
}
}
/// \fn equal ( InputIterator1 first1, InputIterator1 last1,
/// InputIterator2 first2, InputIterator2 last2,
/// BinaryPredicate pred )
/// \return true if all elements in the two ranges are equal
///
/// \param first1 The start of the first range.
/// \param last1 One past the end of the first range.
/// \param first2 The start of the second range.
/// \param last2 One past the end of the second range.
/// \param pred A predicate for comparing the elements of the ranges
template
<
class
InputIterator1
,
class
InputIterator2
,
class
BinaryPredicate
>
bool
equal
(
InputIterator1
first1
,
InputIterator1
last1
,
InputIterator2
first2
,
InputIterator2
last2
,
BinaryPredicate
pred
)
{
return
boost
::
algorithm
::
detail
::
equal
(
first1
,
last1
,
first2
,
last2
,
pred
,
typename
std
::
iterator_traits
<
InputIterator1
>::
iterator_category
(),
typename
std
::
iterator_traits
<
InputIterator2
>::
iterator_category
());
}
/// \fn equal ( InputIterator1 first1, InputIterator1 last1,
/// InputIterator2 first2, InputIterator2 last2 )
/// \return true if all elements in the two ranges are equal
///
/// \param first1 The start of the first range.
/// \param last1 One past the end of the first range.
/// \param first2 The start of the second range.
/// \param last2 One past the end of the second range.
template
<
class
InputIterator1
,
class
InputIterator2
>
bool
equal
(
InputIterator1
first1
,
InputIterator1
last1
,
InputIterator2
first2
,
InputIterator2
last2
)
{
return
boost
::
algorithm
::
detail
::
equal
(
first1
,
last1
,
first2
,
last2
,
boost
::
algorithm
::
detail
::
eq
<
typename
std
::
iterator_traits
<
InputIterator1
>::
value_type
,
typename
std
::
iterator_traits
<
InputIterator2
>::
value_type
>
(),
typename
std
::
iterator_traits
<
InputIterator1
>::
iterator_category
(),
typename
std
::
iterator_traits
<
InputIterator2
>::
iterator_category
());
}
// There are already range-based versions of these.
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_EQUAL_HPP
assembler/ext/include/boost/algorithm/cxx14/is_permutation.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2014.
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)
*/
/// \file is_permutation.hpp
/// \brief Is a sequence a permutation of another sequence (four iterator versions)
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_IS_PERMUTATION14_HPP
#define BOOST_ALGORITHM_IS_PERMUTATION14_HPP
#include
<utility>
// for std::pair
#include
<functional>
// for std::equal_to
#include
<iterator>
#include
<boost/algorithm/cxx11/is_permutation.hpp>
#include
<boost/algorithm/cxx14/mismatch.hpp>
namespace
boost
{
namespace
algorithm
{
/// \fn is_permutation ( ForwardIterator1 first, ForwardIterator1 last,
/// ForwardIterator2 first2, ForwardIterator2 last2 )
/// \brief Tests to see if the sequence [first,last) is a permutation of the sequence starting at first2
///
/// \param first1 The start of the input sequence
/// \param last2 One past the end of the input sequence
/// \param first2 The start of the second sequence
/// \param last1 One past the end of the second sequence
/// \note This function is part of the C++2014 standard library.
template
<
class
ForwardIterator1
,
class
ForwardIterator2
>
bool
is_permutation
(
ForwardIterator1
first1
,
ForwardIterator1
last1
,
ForwardIterator2
first2
,
ForwardIterator2
last2
)
{
// How should I deal with the idea that ForwardIterator1::value_type
// and ForwardIterator2::value_type could be different? Define my own comparison predicate?
std
::
pair
<
ForwardIterator1
,
ForwardIterator2
>
eq
=
boost
::
algorithm
::
mismatch
(
first1
,
last1
,
first2
,
last2
);
if
(
eq
.
first
==
last1
&&
eq
.
second
==
last2
)
return
true
;
return
boost
::
algorithm
::
detail
::
is_permutation_tag
(
eq
.
first
,
last1
,
eq
.
second
,
last2
,
std
::
equal_to
<
typename
std
::
iterator_traits
<
ForwardIterator1
>::
value_type
>
(),
typename
std
::
iterator_traits
<
ForwardIterator1
>::
iterator_category
(),
typename
std
::
iterator_traits
<
ForwardIterator2
>::
iterator_category
());
}
/// \fn is_permutation ( ForwardIterator1 first, ForwardIterator1 last,
/// ForwardIterator2 first2, ForwardIterator2 last2,
/// BinaryPredicate p )
/// \brief Tests to see if the sequence [first,last) is a permutation of the sequence starting at first2
///
/// \param first1 The start of the input sequence
/// \param last1 One past the end of the input sequence
/// \param first2 The start of the second sequence
/// \param last2 One past the end of the second sequence
/// \param pred The predicate to compare elements with
///
/// \note This function is part of the C++2014 standard library.
template
<
class
ForwardIterator1
,
class
ForwardIterator2
,
class
BinaryPredicate
>
bool
is_permutation
(
ForwardIterator1
first1
,
ForwardIterator1
last1
,
ForwardIterator2
first2
,
ForwardIterator2
last2
,
BinaryPredicate
pred
)
{
std
::
pair
<
ForwardIterator1
,
ForwardIterator2
>
eq
=
boost
::
algorithm
::
mismatch
(
first1
,
last1
,
first2
,
last2
,
pred
);
if
(
eq
.
first
==
last1
&&
eq
.
second
==
last2
)
return
true
;
return
boost
::
algorithm
::
detail
::
is_permutation_tag
(
first1
,
last1
,
first2
,
last2
,
pred
,
typename
std
::
iterator_traits
<
ForwardIterator1
>::
iterator_category
(),
typename
std
::
iterator_traits
<
ForwardIterator2
>::
iterator_category
());
}
}}
#endif // BOOST_ALGORITHM_IS_PERMUTATION14_HPP
assembler/ext/include/boost/algorithm/cxx14/mismatch.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2008-2012.
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE10.txt or copy at http://www.boost.org/LICENSE10.txt)
*/
/// \file mismatch.hpp
/// \brief Find the first mismatched element in a sequence
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_MISMATCH_HPP
#define BOOST_ALGORITHM_MISMATCH_HPP
#include
<utility>
// for std::pair
namespace
boost
{
namespace
algorithm
{
/// \fn mismatch ( InputIterator1 first1, InputIterator1 last1,
/// InputIterator2 first2, InputIterator2 last2,
/// BinaryPredicate pred )
/// \return a pair of iterators pointing to the first elements in the sequence that do not match
///
/// \param first1 The start of the first range.
/// \param last1 One past the end of the first range.
/// \param first2 The start of the second range.
/// \param last2 One past the end of the second range.
/// \param pred A predicate for comparing the elements of the ranges
template
<
class
InputIterator1
,
class
InputIterator2
,
class
BinaryPredicate
>
std
::
pair
<
InputIterator1
,
InputIterator2
>
mismatch
(
InputIterator1
first1
,
InputIterator1
last1
,
InputIterator2
first2
,
InputIterator2
last2
,
BinaryPredicate
pred
)
{
for
(;
first1
!=
last1
&&
first2
!=
last2
;
++
first1
,
++
first2
)
if
(
!
pred
(
*
first1
,
*
first2
))
break
;
return
std
::
pair
<
InputIterator1
,
InputIterator2
>
(
first1
,
first2
);
}
/// \fn mismatch ( InputIterator1 first1, InputIterator1 last1,
/// InputIterator2 first2, InputIterator2 last2 )
/// \return a pair of iterators pointing to the first elements in the sequence that do not match
///
/// \param first1 The start of the first range.
/// \param last1 One past the end of the first range.
/// \param first2 The start of the second range.
/// \param last2 One past the end of the second range.
template
<
class
InputIterator1
,
class
InputIterator2
>
std
::
pair
<
InputIterator1
,
InputIterator2
>
mismatch
(
InputIterator1
first1
,
InputIterator1
last1
,
InputIterator2
first2
,
InputIterator2
last2
)
{
for
(;
first1
!=
last1
&&
first2
!=
last2
;
++
first1
,
++
first2
)
if
(
*
first1
!=
*
first2
)
break
;
return
std
::
pair
<
InputIterator1
,
InputIterator2
>
(
first1
,
first2
);
}
// There are already range-based versions of these.
}}
// namespace boost and algorithm
#endif // BOOST_ALGORITHM_MISMATCH_HPP
assembler/ext/include/boost/algorithm/gather.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright 2008 Adobe Systems Incorporated
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)
Revision history:
January 2008 mtc Version for Adobe Source Library
January 2013 mtc Version for Boost.Algorithm
*/
/**************************************************************************************************/
/*!
\author Marshall Clow
\date January 2008
*/
#ifndef BOOST_ALGORITHM_GATHER_HPP
#define BOOST_ALGORITHM_GATHER_HPP
#include
<algorithm>
// for std::stable_partition
#include
<functional>
#include
<boost/bind.hpp>
// for boost::bind
#include
<boost/range/begin.hpp>
// for boost::begin(range)
#include
<boost/range/end.hpp>
// for boost::end(range)
/**************************************************************************************************/
/*!
\defgroup gather gather
\ingroup mutating_algorithm
\c gather() takes a collection of elements defined by a pair of iterators and moves
the ones satisfying a predicate to them to a position (called the pivot) within
the sequence. The algorithm is stable. The result is a pair of iterators that
contains the items that satisfy the predicate.
Given an sequence containing:
<pre>
0 1 2 3 4 5 6 7 8 9
</pre>
a call to gather ( arr, arr + 10, arr + 4, IsEven ()) will result in:
<pre>
1 3 0 2 4 6 8 5 7 9
|---|-----|
first | second
pivot
</pre>
The problem is broken down into two basic steps, namely, moving the items before the pivot
and then moving the items from the pivot to the end. These "moves" are done with calls to
stable_partition.
\par Storage Requirements:
The algorithm uses stable_partition, which will attempt to allocate temporary memory,
but will work in-situ if there is none available.
\par Time Complexity:
If there is sufficient memory available, the run time is linear in <code>N</code>.
If there is not any memory available, then the run time is <code>O(N log N)</code>.
*/
/**************************************************************************************************/
namespace
boost
{
namespace
algorithm
{
/**************************************************************************************************/
/*!
\ingroup gather
\brief iterator-based gather implementation
*/
template
<
typename
BidirectionalIterator
,
// Iter models BidirectionalIterator
typename
Pred
>
// Pred models UnaryPredicate
std
::
pair
<
BidirectionalIterator
,
BidirectionalIterator
>
gather
(
BidirectionalIterator
first
,
BidirectionalIterator
last
,
BidirectionalIterator
pivot
,
Pred
pred
)
{
// The first call partitions everything up to (but not including) the pivot element,
// while the second call partitions the rest of the sequence.
return
std
::
make_pair
(
std
::
stable_partition
(
first
,
pivot
,
!
boost
::
bind
<
bool
>
(
pred
,
_1
)),
std
::
stable_partition
(
pivot
,
last
,
boost
::
bind
<
bool
>
(
pred
,
_1
)));
}
/**************************************************************************************************/
/*!
\ingroup gather
\brief range-based gather implementation
*/
template
<
typename
BidirectionalRange
,
//
typename
Pred
>
// Pred models UnaryPredicate
std
::
pair
<
typename
boost
::
range_iterator
<
const
BidirectionalRange
>::
type
,
typename
boost
::
range_iterator
<
const
BidirectionalRange
>::
type
>
gather
(
const
BidirectionalRange
&
range
,
typename
boost
::
range_iterator
<
const
BidirectionalRange
>::
type
pivot
,
Pred
pred
)
{
return
boost
::
algorithm
::
gather
(
boost
::
begin
(
range
),
boost
::
end
(
range
),
pivot
,
pred
);
}
/**************************************************************************************************/
}}
// namespace
/**************************************************************************************************/
#endif
assembler/ext/include/boost/algorithm/hex.hpp
deleted
100644 → 0
View file @
05939cac
/*
Copyright (c) Marshall Clow 2011-2012.
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)
Thanks to Nevin for his comments/help.
*/
/*
General problem - turn a sequence of integral types into a sequence of hexadecimal characters.
- and back.
*/
/// \file hex.hpp
/// \brief Convert sequence of integral types into a sequence of hexadecimal
/// characters and back. Based on the MySQL functions HEX and UNHEX
/// \author Marshall Clow
#ifndef BOOST_ALGORITHM_HEXHPP
#define BOOST_ALGORITHM_HEXHPP
#include
<iterator>
// for std::iterator_traits
#include
<stdexcept>
#include
<boost/range/begin.hpp>
#include
<boost/range/end.hpp>
#include
<boost/exception/exception.hpp>
#include
<boost/exception/info.hpp>
#include
<boost/throw_exception.hpp>
#include
<boost/utility/enable_if.hpp>
#include
<boost/type_traits/is_integral.hpp>
namespace
boost
{
namespace
algorithm
{
/*!
\struct hex_decode_error
\brief Base exception class for all hex decoding errors
*/
/*!
\struct non_hex_input
\brief Thrown when a non-hex value (0-9, A-F) encountered when decoding.
Contains the offending character
*/
/*!
\struct not_enough_input
\brief Thrown when the input sequence unexpectedly ends
*/
struct
hex_decode_error
:
virtual
boost
::
exception
,
virtual
std
::
exception
{};
struct
not_enough_input
:
virtual
hex_decode_error
{};
struct
non_hex_input
:
virtual
hex_decode_error
{};
typedef
boost
::
error_info
<
struct
bad_char_
,
char
>
bad_char
;
namespace
detail
{
/// \cond DOXYGEN_HIDE
template
<
typename
T
,
typename
OutputIterator
>
OutputIterator
encode_one
(
T
val
,
OutputIterator
out
,
const
char
*
hexDigits
)
{
const
std
::
size_t
num_hex_digits
=
2
*
sizeof
(
T
);
char
res
[
num_hex_digits
];
char
*
p
=
res
+
num_hex_digits
;
for
(
std
::
size_t
i
=
0
;
i
<
num_hex_digits
;
++
i
,
val
>>=
4
)
*--
p
=
hexDigits
[
val
&
0x0F
];
return
std
::
copy
(
res
,
res
+
num_hex_digits
,
out
);
}
template
<
typename
T
>
unsigned
char
hex_char_to_int
(
T
val
)
{
char
c
=
static_cast
<
char
>
(
val
);
unsigned
retval
=
0
;
if
(
c
>=
'0'
&&
c
<=
'9'
)
retval
=
c
-
'0'
;
else
if
(
c
>=
'A'
&&
c
<=
'F'
)
retval
=
c
-
'A'
+
10
;
else
if
(
c
>=
'a'
&&
c
<=
'f'
)
retval
=
c
-
'a'
+
10
;
else
BOOST_THROW_EXCEPTION
(
non_hex_input
()
<<
bad_char
(
c
));
return
retval
;
}
// My own iterator_traits class.
// It is here so that I can "reach inside" some kinds of output iterators
// and get the type to write.
template
<
typename
Iterator
>
struct
hex_iterator_traits
{
typedef
typename
std
::
iterator_traits
<
Iterator
>::
value_type
value_type
;
};
template
<
typename
Container
>
struct
hex_iterator_traits
<
std
::
back_insert_iterator
<
Container
>
>
{
typedef
typename
Container
::
value_type
value_type
;
};
template
<
typename
Container
>
struct
hex_iterator_traits
<
std
::
front_insert_iterator
<
Container
>
>
{
typedef
typename
Container
::
value_type
value_type
;
};
template
<
typename
Container
>
struct
hex_iterator_traits
<
std
::
insert_iterator
<
Container
>
>
{
typedef
typename
Container
::
value_type
value_type
;
};
// ostream_iterators have three template parameters.
// The first one is the output type, the second one is the character type of
// the underlying stream, the third is the character traits.
// We only care about the first one.
template
<
typename
T
,
typename
charType
,
typename
traits
>
struct
hex_iterator_traits
<
std
::
ostream_iterator
<
T
,
charType
,
traits
>
>
{
typedef
T
value_type
;
};
template
<
typename
Iterator
>
bool
iter_end
(
Iterator
current
,
Iterator
last
)
{
return
current
==
last
;
}
template
<
typename
T
>
bool
ptr_end
(
const
T
*
ptr
,
const
T
*
/*end*/
)
{
return
*
ptr
==
'\0'
;
}
// What can we assume here about the inputs?
// is std::iterator_traits<InputIterator>::value_type always 'char' ?
// Could it be wchar_t, say? Does it matter?
// We are assuming ASCII for the values - but what about the storage?
template
<
typename
InputIterator
,
typename
OutputIterator
,
typename
EndPred
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
typename
hex_iterator_traits
<
OutputIterator
>::
value_type
>
,
OutputIterator
>::
type
decode_one
(
InputIterator
&
first
,
InputIterator
last
,
OutputIterator
out
,
EndPred
pred
)
{
typedef
typename
hex_iterator_traits
<
OutputIterator
>::
value_type
T
;
T
res
(
0
);
// Need to make sure that we get can read that many chars here.
for
(
std
::
size_t
i
=
0
;
i
<
2
*
sizeof
(
T
);
++
i
,
++
first
)
{
if
(
pred
(
first
,
last
))
BOOST_THROW_EXCEPTION
(
not_enough_input
());
res
=
(
16
*
res
)
+
hex_char_to_int
(
*
first
);
}
*
out
=
res
;
return
++
out
;
}
/// \endcond
}
/// \fn hex ( InputIterator first, InputIterator last, OutputIterator out )
/// \brief Converts a sequence of integral types into a hexadecimal sequence of characters.
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
InputIterator
,
typename
OutputIterator
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
typename
detail
::
hex_iterator_traits
<
InputIterator
>::
value_type
>
,
OutputIterator
>::
type
hex
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
out
)
{
for
(
;
first
!=
last
;
++
first
)
out
=
detail
::
encode_one
(
*
first
,
out
,
"0123456789ABCDEF"
);
return
out
;
}
/// \fn hex_lower ( InputIterator first, InputIterator last, OutputIterator out )
/// \brief Converts a sequence of integral types into a lower case hexadecimal sequence of characters.
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
InputIterator
,
typename
OutputIterator
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
typename
detail
::
hex_iterator_traits
<
InputIterator
>::
value_type
>
,
OutputIterator
>::
type
hex_lower
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
out
)
{
for
(
;
first
!=
last
;
++
first
)
out
=
detail
::
encode_one
(
*
first
,
out
,
"0123456789abcdef"
);
return
out
;
}
/// \fn hex ( const T *ptr, OutputIterator out )
/// \brief Converts a sequence of integral types into a hexadecimal sequence of characters.
///
/// \param ptr A pointer to a 0-terminated sequence of data.
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
T
,
typename
OutputIterator
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
T
>
,
OutputIterator
>::
type
hex
(
const
T
*
ptr
,
OutputIterator
out
)
{
while
(
*
ptr
)
out
=
detail
::
encode_one
(
*
ptr
++
,
out
,
"0123456789ABCDEF"
);
return
out
;
}
/// \fn hex_lower ( const T *ptr, OutputIterator out )
/// \brief Converts a sequence of integral types into a lower case hexadecimal sequence of characters.
///
/// \param ptr A pointer to a 0-terminated sequence of data.
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
T
,
typename
OutputIterator
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
T
>
,
OutputIterator
>::
type
hex_lower
(
const
T
*
ptr
,
OutputIterator
out
)
{
while
(
*
ptr
)
out
=
detail
::
encode_one
(
*
ptr
++
,
out
,
"0123456789abcdef"
);
return
out
;
}
/// \fn hex ( const Range &r, OutputIterator out )
/// \brief Converts a sequence of integral types into a hexadecimal sequence of characters.
///
/// \param r The input range
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
Range
,
typename
OutputIterator
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
typename
detail
::
hex_iterator_traits
<
typename
Range
::
iterator
>::
value_type
>
,
OutputIterator
>::
type
hex
(
const
Range
&
r
,
OutputIterator
out
)
{
return
hex
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
out
);
}
/// \fn hex_lower ( const Range &r, OutputIterator out )
/// \brief Converts a sequence of integral types into a lower case hexadecimal sequence of characters.
///
/// \param r The input range
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
Range
,
typename
OutputIterator
>
typename
boost
::
enable_if
<
boost
::
is_integral
<
typename
detail
::
hex_iterator_traits
<
typename
Range
::
iterator
>::
value_type
>
,
OutputIterator
>::
type
hex_lower
(
const
Range
&
r
,
OutputIterator
out
)
{
return
hex_lower
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
out
);
}
/// \fn unhex ( InputIterator first, InputIterator last, OutputIterator out )
/// \brief Converts a sequence of hexadecimal characters into a sequence of integers.
///
/// \param first The start of the input sequence
/// \param last One past the end of the input sequence
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
InputIterator
,
typename
OutputIterator
>
OutputIterator
unhex
(
InputIterator
first
,
InputIterator
last
,
OutputIterator
out
)
{
while
(
first
!=
last
)
out
=
detail
::
decode_one
(
first
,
last
,
out
,
detail
::
iter_end
<
InputIterator
>
);
return
out
;
}
/// \fn unhex ( const T *ptr, OutputIterator out )
/// \brief Converts a sequence of hexadecimal characters into a sequence of integers.
///
/// \param ptr A pointer to a null-terminated input sequence.
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
T
,
typename
OutputIterator
>
OutputIterator
unhex
(
const
T
*
ptr
,
OutputIterator
out
)
{
// If we run into the terminator while decoding, we will throw a
// malformed input exception. It would be nicer to throw a 'Not enough input'
// exception - but how much extra work would that require?
while
(
*
ptr
)
out
=
detail
::
decode_one
(
ptr
,
(
const
T
*
)
NULL
,
out
,
detail
::
ptr_end
<
T
>
);
return
out
;
}
/// \fn OutputIterator unhex ( const Range &r, OutputIterator out )
/// \brief Converts a sequence of hexadecimal characters into a sequence of integers.
///
/// \param r The input range
/// \param out An output iterator to the results into
/// \return The updated output iterator
/// \note Based on the MySQL function of the same name
template
<
typename
Range
,
typename
OutputIterator
>
OutputIterator
unhex
(
const
Range
&
r
,
OutputIterator
out
)
{
return
unhex
(
boost
::
begin
(
r
),
boost
::
end
(
r
),
out
);
}
/// \fn String hex ( const String &input )
/// \brief Converts a sequence of integral types into a hexadecimal sequence of characters.
///
/// \param input A container to be converted
/// \return A container with the encoded text
template
<
typename
String
>
String
hex
(
const
String
&
input
)
{
String
output
;
output
.
reserve
(
input
.
size
()
*
(
2
*
sizeof
(
typename
String
::
value_type
)));
(
void
)
hex
(
input
,
std
::
back_inserter
(
output
));
return
output
;
}
/// \fn String hex_lower ( const String &input )
/// \brief Converts a sequence of integral types into a lower case hexadecimal sequence of characters.
///
/// \param input A container to be converted
/// \return A container with the encoded text
template
<
typename
String
>
String
hex_lower
(
const
String
&
input
)
{
String
output
;
output
.
reserve
(
input
.
size
()
*
(
2
*
sizeof
(
typename
String
::
value_type
)));
(
void
)
hex_lower
(
input
,
std
::
back_inserter
(
output
));
return
output
;
}
/// \fn String unhex ( const String &input )
/// \brief Converts a sequence of hexadecimal characters into a sequence of characters.
///
/// \param input A container to be converted
/// \return A container with the decoded text
template
<
typename
String
>
String
unhex
(
const
String
&
input
)
{
String
output
;
output
.
reserve
(
input
.
size
()
/
(
2
*
sizeof
(
typename
String
::
value_type
)));
(
void
)
unhex
(
input
,
std
::
back_inserter
(
output
));
return
output
;
}
}}
#endif // BOOST_ALGORITHM_HEXHPP
Prev
1
2
3
4
5
…
50
Next