mirror of
https://github.com/bolero-MURAKAMI/Sprout
synced 2025-08-03 12:49:50 +00:00
fix math implementation.
This commit is contained in:
parent
3500d0d49c
commit
1636398742
49 changed files with 227 additions and 456 deletions
|
@ -1,44 +0,0 @@
|
|||
#ifndef SPROUT_DETAIL_ALGORITHM_EXT_HPP
|
||||
#define SPROUT_DETAIL_ALGORITHM_EXT_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/iterator/operation.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
//
|
||||
// count_n
|
||||
//
|
||||
template<typename InputIterator, typename Size, typename T>
|
||||
SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type count_n(
|
||||
InputIterator first,
|
||||
Size n,
|
||||
T const& value
|
||||
)
|
||||
{
|
||||
return n == 0
|
||||
? 0
|
||||
: (*first == value ? 1 : 0) + sprout::detail::count_n(sprout::next(first), n - 1, value)
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
// count_n_if
|
||||
//
|
||||
template<typename InputIterator, typename Size, typename Predicate>
|
||||
SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type count_n_if(
|
||||
InputIterator first,
|
||||
Size n,
|
||||
Predicate pred
|
||||
)
|
||||
{
|
||||
return n == 0
|
||||
? 0
|
||||
: (pred(*first) ? 1 : 0) + sprout::detail::count_n_if(sprout::next(first), n - 1, pred)
|
||||
;
|
||||
}
|
||||
} // namespace detail
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_DETAIL_ALGORITHM_EXT_HPP
|
27
sprout/detail/count_n.hpp
Normal file
27
sprout/detail/count_n.hpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef SPROUT_DETAIL_COUNT_N_HPP
|
||||
#define SPROUT_DETAIL_COUNT_N_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/iterator/operation.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
//
|
||||
// count_n
|
||||
//
|
||||
template<typename InputIterator, typename Size, typename T>
|
||||
SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type count_n(
|
||||
InputIterator first,
|
||||
Size n,
|
||||
T const& value
|
||||
)
|
||||
{
|
||||
return n == 0 ? 0
|
||||
: (*first == value ? 1 : 0) + sprout::detail::count_n(sprout::next(first), n - 1, value)
|
||||
;
|
||||
}
|
||||
} // namespace detail
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_DETAIL_COUNT_N_HPP
|
27
sprout/detail/count_n_if.hpp
Normal file
27
sprout/detail/count_n_if.hpp
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef SPROUT_DETAIL_COUNT_N_IF_HPP
|
||||
#define SPROUT_DETAIL_COUNT_N_IF_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/iterator/operation.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
//
|
||||
// count_n_if
|
||||
//
|
||||
template<typename InputIterator, typename Size, typename Predicate>
|
||||
SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type count_n_if(
|
||||
InputIterator first,
|
||||
Size n,
|
||||
Predicate pred
|
||||
)
|
||||
{
|
||||
return n == 0 ? 0
|
||||
: (pred(*first) ? 1 : 0) + sprout::detail::count_n_if(sprout::next(first), n - 1, pred)
|
||||
;
|
||||
}
|
||||
} // namespace detail
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_DETAIL_COUNT_N_IF_HPP
|
|
@ -1,40 +0,0 @@
|
|||
#ifndef SPROUT_DETAIL_ITERATOR_EXT_HPP
|
||||
#define SPROUT_DETAIL_ITERATOR_EXT_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/iterator/operation.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
template<typename Iterator>
|
||||
SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type bidirectional_distance_impl(
|
||||
Iterator first1,
|
||||
Iterator first2,
|
||||
Iterator last,
|
||||
typename std::iterator_traits<Iterator>::difference_type current = 1
|
||||
)
|
||||
{
|
||||
return first1 == last ? current
|
||||
: first2 == last ? -current
|
||||
: sprout::detail::bidirectional_distance_impl(sprout::next(first1), sprout::prev(first2), last, current + 1)
|
||||
;
|
||||
}
|
||||
|
||||
//
|
||||
// bidirectional_distance
|
||||
//
|
||||
template<typename Iterator>
|
||||
SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type bidirectional_distance(
|
||||
Iterator first,
|
||||
Iterator last
|
||||
)
|
||||
{
|
||||
return first == last ? 0
|
||||
: sprout::detail::bidirectional_distance_impl(sprout::next(first), sprout::prev(first), last)
|
||||
;
|
||||
}
|
||||
} // namespace detail
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_DETAIL_ITERATOR_EXT_HPP
|
|
@ -7,12 +7,12 @@
|
|||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
template<typename Iterator>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type overlap_count_impl(
|
||||
Iterator first,
|
||||
Iterator last,
|
||||
typename std::iterator_traits<Iterator>::value_type const& value,
|
||||
typename std::iterator_traits<Iterator>::difference_type current = 0
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type overlap_count_impl(
|
||||
InputIterator first,
|
||||
InputIterator last,
|
||||
typename std::iterator_traits<InputIterator>::value_type const& value,
|
||||
typename std::iterator_traits<InputIterator>::difference_type current = 0
|
||||
)
|
||||
{
|
||||
return first == last
|
||||
|
@ -25,10 +25,10 @@ namespace sprout {
|
|||
//
|
||||
// overlap_count
|
||||
//
|
||||
template<typename Iterator>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type overlap_count(
|
||||
Iterator first,
|
||||
Iterator last
|
||||
template<typename InputIterator>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type overlap_count(
|
||||
InputIterator first,
|
||||
InputIterator last
|
||||
)
|
||||
{
|
||||
return first == last
|
||||
|
@ -37,12 +37,12 @@ namespace sprout {
|
|||
;
|
||||
}
|
||||
|
||||
template<typename Iterator, typename Predicate>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type overlap_count_impl(
|
||||
Iterator first,
|
||||
Iterator last,
|
||||
template<typename InputIterator, typename Predicate>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type overlap_count_impl(
|
||||
InputIterator first,
|
||||
InputIterator last,
|
||||
Predicate pred,
|
||||
typename std::iterator_traits<Iterator>::value_type const& value
|
||||
typename std::iterator_traits<InputIterator>::value_type const& value
|
||||
)
|
||||
{
|
||||
return first == last
|
||||
|
@ -55,10 +55,10 @@ namespace sprout {
|
|||
//
|
||||
// overlap_count
|
||||
//
|
||||
template<typename Iterator, typename Predicate>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<Iterator>::difference_type overlap_count(
|
||||
Iterator first,
|
||||
Iterator last,
|
||||
template<typename InputIterator, typename Predicate>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator>::difference_type overlap_count(
|
||||
InputIterator first,
|
||||
InputIterator last,
|
||||
Predicate pred
|
||||
)
|
||||
{
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
#ifndef SPROUT_DETAIL_OVERLAP_COUNT_2_HPP
|
||||
#define SPROUT_DETAIL_OVERLAP_COUNT_2_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/iterator/operation.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
//
|
||||
// overlap_count_2
|
||||
//
|
||||
template<typename Iterator1, typename Iterator2, typename Compare>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<Iterator1>::difference_type overlap_count_2(
|
||||
Iterator1 first1,
|
||||
Iterator1 last1,
|
||||
Iterator2 first2,
|
||||
Iterator2 last2,
|
||||
Compare comp
|
||||
)
|
||||
{
|
||||
return first1 != last1 && first2 != last2
|
||||
? comp(*first1, *first2)
|
||||
? sprout::detail::overlap_count_2(sprout::next(first1), last1, first2, last2, comp)
|
||||
: comp(*first2, *first1)
|
||||
? sprout::detail::overlap_count_2(first1, last1, sprout::next(first2), last2, comp)
|
||||
: 1 + sprout::detail::overlap_count_2(sprout::next(first1), last1, sprout::next(first2), last2, comp)
|
||||
: 0
|
||||
;
|
||||
}
|
||||
//
|
||||
// overlap_count_2
|
||||
//
|
||||
template<typename Iterator1, typename Iterator2>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<Iterator1>::difference_type overlap_count_2(
|
||||
Iterator1 first1,
|
||||
Iterator1 last1,
|
||||
Iterator2 first2,
|
||||
Iterator2 last2
|
||||
)
|
||||
{
|
||||
return first1 != last1 && first2 != last2
|
||||
? *first1 < *first2
|
||||
? sprout::detail::overlap_count_2(sprout::next(first1), last1, first2, last2)
|
||||
: *first2 < *first1
|
||||
? sprout::detail::overlap_count_2(first1, last1, sprout::next(first2), last2)
|
||||
: 1 + sprout::detail::overlap_count_2(sprout::next(first1), last1, sprout::next(first2), last2)
|
||||
: 0
|
||||
;
|
||||
}
|
||||
} // namespace detail
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_DETAIL_OVERLAP_COUNT_2_HPP
|
54
sprout/detail/set_overlap_count.hpp
Normal file
54
sprout/detail/set_overlap_count.hpp
Normal file
|
@ -0,0 +1,54 @@
|
|||
#ifndef SPROUT_DETAIL_SET_OVERLAP_COUNT_HPP
|
||||
#define SPROUT_DETAIL_SET_OVERLAP_COUNT_HPP
|
||||
|
||||
#include <iterator>
|
||||
#include <sprout/config.hpp>
|
||||
#include <sprout/iterator/operation.hpp>
|
||||
|
||||
namespace sprout {
|
||||
namespace detail {
|
||||
//
|
||||
// set_overlap_count
|
||||
//
|
||||
template<typename InputIterator1, typename InputIterator2, typename Compare>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator1>::difference_type set_overlap_count(
|
||||
InputIterator1 first1,
|
||||
InputIterator1 last1,
|
||||
InputIterator2 first2,
|
||||
InputIterator2 last2,
|
||||
Compare comp
|
||||
)
|
||||
{
|
||||
return first1 != last1 && first2 != last2
|
||||
? comp(*first1, *first2)
|
||||
? sprout::detail::set_overlap_count(sprout::next(first1), last1, first2, last2, comp)
|
||||
: comp(*first2, *first1)
|
||||
? sprout::detail::set_overlap_count(first1, last1, sprout::next(first2), last2, comp)
|
||||
: 1 + sprout::detail::set_overlap_count(sprout::next(first1), last1, sprout::next(first2), last2, comp)
|
||||
: 0
|
||||
;
|
||||
}
|
||||
//
|
||||
// set_overlap_count
|
||||
//
|
||||
template<typename InputIterator1, typename InputIterator2>
|
||||
inline SPROUT_CONSTEXPR typename std::iterator_traits<InputIterator1>::difference_type set_overlap_count(
|
||||
InputIterator1 first1,
|
||||
InputIterator1 last1,
|
||||
InputIterator2 first2,
|
||||
InputIterator2 last2
|
||||
)
|
||||
{
|
||||
return first1 != last1 && first2 != last2
|
||||
? *first1 < *first2
|
||||
? sprout::detail::set_overlap_count(sprout::next(first1), last1, first2, last2)
|
||||
: *first2 < *first1
|
||||
? sprout::detail::set_overlap_count(first1, last1, sprout::next(first2), last2)
|
||||
: 1 + sprout::detail::set_overlap_count(sprout::next(first1), last1, sprout::next(first2), last2)
|
||||
: 0
|
||||
;
|
||||
}
|
||||
} // namespace detail
|
||||
} // namespace sprout
|
||||
|
||||
#endif // #ifndef SPROUT_DETAIL_SET_OVERLAP_COUNT_HPP
|
Loading…
Add table
Add a link
Reference in a new issue