mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2025-07-16 15:14:13 +00:00
fix support for STL container: some algorithms
This commit is contained in:
parent
ace6acad69
commit
a9cd556f8e
28 changed files with 911 additions and 106 deletions
|
@ -3,7 +3,6 @@
|
|||
|
||||
#include <type_traits>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/pit.hpp>
|
||||
#include <sprout/container/traits.hpp>
|
||||
#include <sprout/container/functions.hpp>
|
||||
#include <sprout/algorithm/fixed/result_of.hpp>
|
||||
|
@ -37,7 +36,7 @@ namespace sprout {
|
|||
{}
|
||||
template<typename Result>
|
||||
SPROUT_CONSTEXPR operator Result() const {
|
||||
return sprout::range::fixed::copy(*this, sprout::pit<Result>());
|
||||
return sprout::range::fixed::copy<Result>(*this);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <sprout/container/traits.hpp>
|
||||
#include <sprout/container/functions.hpp>
|
||||
#include <sprout/iterator/transform_iterator.hpp>
|
||||
#include <sprout/iterator/replace_iterator.hpp>
|
||||
#include <sprout/range/adaptor/detail/adapted_range_default.hpp>
|
||||
#include <sprout/range/algorithm/copy.hpp>
|
||||
#include <sprout/type_traits/lvalue_reference.hpp>
|
||||
|
@ -15,25 +16,6 @@
|
|||
|
||||
namespace sprout {
|
||||
namespace adaptors {
|
||||
namespace detail {
|
||||
template<typename T>
|
||||
class replace_value {
|
||||
public:
|
||||
typedef T const& result_type;
|
||||
typedef T const& argument_type;
|
||||
private:
|
||||
T old_;
|
||||
T new_;
|
||||
public:
|
||||
SPROUT_CONSTEXPR replace_value(T const& old_value, T const& new_value)
|
||||
: old_(old_value)
|
||||
, new_(new_value)
|
||||
{}
|
||||
SPROUT_CONSTEXPR T operator()(T const& value) const {
|
||||
return (value == old_) ? new_ : value;
|
||||
}
|
||||
};
|
||||
} // namespace detail
|
||||
//
|
||||
// replaced_range
|
||||
//
|
||||
|
@ -42,7 +24,7 @@ namespace sprout {
|
|||
: public sprout::adaptors::detail::adapted_range_default<
|
||||
Range,
|
||||
sprout::transform_iterator<
|
||||
sprout::adaptors::detail::replace_value<typename sprout::container_traits<Range>::value_type>,
|
||||
sprout::replace_value<typename sprout::container_traits<Range>::value_type>,
|
||||
typename sprout::container_traits<Range>::iterator
|
||||
>
|
||||
>
|
||||
|
@ -51,7 +33,7 @@ namespace sprout {
|
|||
typedef sprout::adaptors::detail::adapted_range_default<
|
||||
Range,
|
||||
sprout::transform_iterator<
|
||||
sprout::adaptors::detail::replace_value<typename sprout::container_traits<Range>::value_type>,
|
||||
sprout::replace_value<typename sprout::container_traits<Range>::value_type>,
|
||||
typename sprout::container_traits<Range>::iterator
|
||||
>
|
||||
> base_type;
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <sprout/container/traits.hpp>
|
||||
#include <sprout/container/functions.hpp>
|
||||
#include <sprout/iterator/transform_iterator.hpp>
|
||||
#include <sprout/iterator/replace_if_iterator.hpp>
|
||||
#include <sprout/range/adaptor/detail/adapted_range_default.hpp>
|
||||
#include <sprout/range/algorithm/copy.hpp>
|
||||
#include <sprout/type_traits/lvalue_reference.hpp>
|
||||
|
@ -15,26 +16,6 @@
|
|||
|
||||
namespace sprout {
|
||||
namespace adaptors {
|
||||
namespace detail {
|
||||
template<typename Predicate, typename T>
|
||||
class replace_value_if {
|
||||
public:
|
||||
typedef Predicate predicate_type;
|
||||
typedef T const& result_type;
|
||||
typedef T const& argument_type;
|
||||
private:
|
||||
Predicate pred_;
|
||||
T new_;
|
||||
public:
|
||||
SPROUT_CONSTEXPR replace_value_if(Predicate pred, T const& new_value)
|
||||
: pred_(pred)
|
||||
, new_(new_value)
|
||||
{}
|
||||
SPROUT_CONSTEXPR T operator()(T const& value) const {
|
||||
return pred_(value) ? new_ : value;
|
||||
}
|
||||
};
|
||||
} // namespace detail
|
||||
//
|
||||
// replaced_if_range
|
||||
//
|
||||
|
@ -43,7 +24,7 @@ namespace sprout {
|
|||
: public sprout::adaptors::detail::adapted_range_default<
|
||||
Range,
|
||||
sprout::transform_iterator<
|
||||
sprout::adaptors::detail::replace_value_if<Predicate, typename sprout::container_traits<Range>::value_type>,
|
||||
sprout::replace_value_if<Predicate, typename sprout::container_traits<Range>::value_type>,
|
||||
typename sprout::container_traits<Range>::iterator
|
||||
>
|
||||
>
|
||||
|
@ -53,7 +34,7 @@ namespace sprout {
|
|||
typedef sprout::adaptors::detail::adapted_range_default<
|
||||
Range,
|
||||
sprout::transform_iterator<
|
||||
sprout::adaptors::detail::replace_value_if<Predicate, typename sprout::container_traits<Range>::value_type>,
|
||||
sprout::replace_value_if<Predicate, typename sprout::container_traits<Range>::value_type>,
|
||||
typename sprout::container_traits<Range>::iterator
|
||||
>
|
||||
> base_type;
|
||||
|
|
|
@ -18,6 +18,12 @@ namespace sprout {
|
|||
copy(Input const& input, Result const& result) {
|
||||
return sprout::fixed::copy(sprout::begin(input), sprout::end(input), result);
|
||||
}
|
||||
|
||||
template<typename Result, typename Input>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Result>::type
|
||||
copy(Input const& input) {
|
||||
return sprout::fixed::copy<Result>(sprout::begin(input), sprout::end(input));
|
||||
}
|
||||
} // namespace fixed
|
||||
|
||||
using sprout::range::fixed::copy;
|
||||
|
|
|
@ -18,6 +18,12 @@ namespace sprout {
|
|||
copy_backward(Input const& input, Result const& result) {
|
||||
return sprout::fixed::copy_backward(sprout::begin(input), sprout::end(input), result);
|
||||
}
|
||||
|
||||
template<typename Result, typename Input>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Result>::type
|
||||
copy_backward(Input const& input) {
|
||||
return sprout::fixed::copy_backward<Result>(sprout::begin(input), sprout::end(input));
|
||||
}
|
||||
} // namespace fixed
|
||||
|
||||
using sprout::range::fixed::copy_backward;
|
||||
|
|
|
@ -18,6 +18,12 @@ namespace sprout {
|
|||
copy_if(Input const& input, Result const& result, Predicate pred) {
|
||||
return sprout::fixed::copy_if(sprout::begin(input), sprout::end(input), result);
|
||||
}
|
||||
|
||||
template<typename Result, typename Input, typename Predicate>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Result>::type
|
||||
copy_if(Input const& input, Predicate pred) {
|
||||
return sprout::fixed::copy_if<Result>(sprout::begin(input), sprout::end(input));
|
||||
}
|
||||
} // namespace fixed
|
||||
|
||||
using sprout::range::fixed::copy_if;
|
||||
|
|
|
@ -18,6 +18,12 @@ namespace sprout {
|
|||
replace_copy(Input const& input, Result const& result, T const& old_value, T const& new_value) {
|
||||
return sprout::fixed::replace_copy(sprout::begin(input), sprout::end(input), result, old_value, new_value);
|
||||
}
|
||||
|
||||
template<typename Result, typename Input, typename T>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Result>::type
|
||||
replace_copy(Input const& input, T const& old_value, T const& new_value) {
|
||||
return sprout::fixed::replace_copy<Result>(sprout::begin(input), sprout::end(input), old_value, new_value);
|
||||
}
|
||||
} // namespace fixed
|
||||
|
||||
using sprout::range::fixed::replace_copy;
|
||||
|
|
|
@ -18,6 +18,12 @@ namespace sprout {
|
|||
replace_copy_if(Input const& input, Result const& result, Predicate pred, T const& new_value) {
|
||||
return sprout::fixed::replace_copy_if(sprout::begin(input), sprout::end(input), result, pred, new_value);
|
||||
}
|
||||
|
||||
template<typename Result, typename Input, typename T, typename Predicate>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Result>::type
|
||||
replace_copy_if(Input const& input, Predicate pred, T const& new_value) {
|
||||
return sprout::fixed::replace_copy_if<Result>(sprout::begin(input), sprout::end(input), pred, new_value);
|
||||
}
|
||||
} // namespace fixed
|
||||
|
||||
using sprout::range::fixed::replace_copy_if;
|
||||
|
|
|
@ -23,6 +23,17 @@ namespace sprout {
|
|||
transform(Input1 const& input1, Input2 const& input2, Result const& result, BinaryOperation op) {
|
||||
return sprout::fixed::transform(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), result, op);
|
||||
}
|
||||
|
||||
template<typename Result, typename Input, typename UnaryOperation>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Result>::type
|
||||
transform(Input const& input, UnaryOperation op) {
|
||||
return sprout::fixed::transform<Result>(sprout::begin(input), sprout::end(input), op);
|
||||
}
|
||||
template<typename Result, typename Input1, typename Input2, typename BinaryOperation>
|
||||
inline SPROUT_CONSTEXPR typename sprout::fixed::result_of::algorithm<Result>::type
|
||||
transform(Input1 const& input1, Input2 const& input2, BinaryOperation op) {
|
||||
return sprout::fixed::transform<Result>(sprout::begin(input1), sprout::end(input1), sprout::begin(input2), op);
|
||||
}
|
||||
} // namespace fixed
|
||||
|
||||
using sprout::range::fixed::transform;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue