mirror of
https://github.com/Naios/continuable.git
synced 2026-02-16 23:29:48 +08:00
Traits and util cleanup
This commit is contained in:
parent
0dbcccdc9e
commit
acc15b46ab
@ -507,7 +507,7 @@ public:
|
|||||||
/// // ...
|
/// // ...
|
||||||
/// });
|
/// });
|
||||||
///
|
///
|
||||||
/// (supply(10, 'T') || supply(10.f, 'T'))
|
/// (make_ready_continuable(10, 'A') || make_ready_continuable(29, 'B'))
|
||||||
/// .then([](int a, char b) {
|
/// .then([](int a, char b) {
|
||||||
/// // ...
|
/// // ...
|
||||||
/// });
|
/// });
|
||||||
|
|||||||
@ -197,10 +197,6 @@ struct composition_finalizer<composition_strategy_any_tag> {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
|
||||||
struct composition_finalizer<composition_strategy_any_fail_fast_tag>
|
|
||||||
: composition_finalizer<composition_strategy_any_tag> {};
|
|
||||||
} // namespace composition
|
} // namespace composition
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace cti
|
} // namespace cti
|
||||||
|
|||||||
@ -49,7 +49,6 @@ namespace detail {
|
|||||||
namespace composition {
|
namespace composition {
|
||||||
struct composition_strategy_all_tag {};
|
struct composition_strategy_all_tag {};
|
||||||
struct composition_strategy_any_tag {};
|
struct composition_strategy_any_tag {};
|
||||||
struct composition_strategy_any_fail_fast_tag {};
|
|
||||||
struct composition_strategy_seq_tag {};
|
struct composition_strategy_seq_tag {};
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
@ -62,9 +61,6 @@ template <>
|
|||||||
struct is_composition_strategy<composition_strategy_any_tag> // ...
|
struct is_composition_strategy<composition_strategy_any_tag> // ...
|
||||||
: std::true_type {};
|
: std::true_type {};
|
||||||
template <>
|
template <>
|
||||||
struct is_composition_strategy<composition_strategy_any_fail_fast_tag> // ...
|
|
||||||
: std::true_type {};
|
|
||||||
template <>
|
|
||||||
struct is_composition_strategy<composition_strategy_seq_tag> // ...
|
struct is_composition_strategy<composition_strategy_seq_tag> // ...
|
||||||
: std::true_type {};
|
: std::true_type {};
|
||||||
|
|
||||||
|
|||||||
@ -52,28 +52,26 @@
|
|||||||
#if (defined(_MSC_VER) && defined(_HAS_CXX17) && _HAS_CXX17) || \
|
#if (defined(_MSC_VER) && defined(_HAS_CXX17) && _HAS_CXX17) || \
|
||||||
(__cplusplus >= 201703L)
|
(__cplusplus >= 201703L)
|
||||||
#define CONTINUABLE_HAS_CXX17_CONSTEXPR_IF
|
#define CONTINUABLE_HAS_CXX17_CONSTEXPR_IF
|
||||||
#define CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION
|
|
||||||
#define CONTINUABLE_HAS_CXX17_DISJUNCTION
|
#define CONTINUABLE_HAS_CXX17_DISJUNCTION
|
||||||
#define CONTINUABLE_HAS_CXX17_CONJUNCTION
|
#define CONTINUABLE_HAS_CXX17_CONJUNCTION
|
||||||
#else
|
#else
|
||||||
// Generic feature detection based on __has_feature
|
// Generic feature detection based on __has_feature
|
||||||
#if defined(__has_feature)
|
#if defined(__has_feature)
|
||||||
#if !defined(CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION) && \
|
#if !defined(CONTINUABLE_HAS_CXX17_CONSTEXPR_IF) && \
|
||||||
__has_feature(cxx_if_constexpr)
|
__has_feature(cxx_if_constexpr)
|
||||||
#define CONTINUABLE_HAS_CXX17_CONSTEXPR_IF
|
#define CONTINUABLE_HAS_CXX17_CONSTEXPR_IF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION) && \
|
|
||||||
__has_feature(cxx_fold_expressions)
|
|
||||||
// PR not merged into the clang master yet
|
|
||||||
#define CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION) && \
|
#if !defined(CONTINUABLE_HAS_CXX17_DISJUNCTION) && \
|
||||||
defined(__cpp_lib_experimental_logical_traits) && \
|
defined(__cpp_lib_experimental_logical_traits) && \
|
||||||
(__cpp_lib_experimental_logical_traits >= 201511)
|
(__cpp_lib_experimental_logical_traits >= 201511)
|
||||||
#define CONTINUABLE_HAS_CXX17_DISJUNCTION
|
#define CONTINUABLE_HAS_CXX17_DISJUNCTION
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CONTINUABLE_HAS_CXX17_CONJUNCTION) && \
|
||||||
|
defined(__cpp_lib_experimental_logical_traits) && \
|
||||||
|
(__cpp_lib_experimental_logical_traits >= 201511)
|
||||||
#define CONTINUABLE_HAS_CXX17_CONJUNCTION
|
#define CONTINUABLE_HAS_CXX17_CONJUNCTION
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -272,23 +272,6 @@ constexpr auto static_if(Type&& type, Check&& check,
|
|||||||
std::forward<FalseCallback>(falseCallback));
|
std::forward<FalseCallback>(falseCallback));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A compile-time while loop, which loops as long the value matches
|
|
||||||
/// the predicate. The handler shall return the next value.
|
|
||||||
template <typename Value, typename Predicate, typename Handler>
|
|
||||||
constexpr auto static_while(Value&& value, Predicate&& predicate,
|
|
||||||
Handler&& handler) {
|
|
||||||
return static_if(std::forward<Value>(value), predicate,
|
|
||||||
[&](auto&& result) mutable {
|
|
||||||
return static_while(
|
|
||||||
handler(std::forward<decltype(result)>(result)),
|
|
||||||
std::forward<Predicate>(predicate),
|
|
||||||
std::forward<Handler>(handler));
|
|
||||||
},
|
|
||||||
[&](auto&& result) mutable {
|
|
||||||
return std::forward<decltype(result)>(result);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns a validator which checks whether the given sequenceable is empty
|
/// Returns a validator which checks whether the given sequenceable is empty
|
||||||
inline auto is_empty() noexcept {
|
inline auto is_empty() noexcept {
|
||||||
return [](auto const& checkable) {
|
return [](auto const& checkable) {
|
||||||
|
|||||||
@ -263,24 +263,6 @@ private:
|
|||||||
*(volatile int*)0 = 0;
|
*(volatile int*)0 = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Exposes functionality to emulate later standard features
|
|
||||||
namespace emulation {
|
|
||||||
#ifndef CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION
|
|
||||||
/// Combines the given arguments with the given folding function
|
|
||||||
template <typename F, typename First>
|
|
||||||
constexpr auto fold(F&& /*folder*/, First&& first) {
|
|
||||||
return std::forward<First>(first);
|
|
||||||
}
|
|
||||||
/// Combines the given arguments with the given folding function
|
|
||||||
template <typename F, typename First, typename Second, typename... Rest>
|
|
||||||
auto fold(F&& folder, First&& first, Second&& second, Rest&&... rest) {
|
|
||||||
auto res = folder(std::forward<First>(first), std::forward<Second>(second));
|
|
||||||
return fold(std::forward<F>(folder), std::move(res),
|
|
||||||
std::forward<Rest>(rest)...);
|
|
||||||
}
|
|
||||||
#endif // CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION
|
|
||||||
} // namespace emulation
|
|
||||||
} // namespace util
|
} // namespace util
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
} // namespace cti
|
} // namespace cti
|
||||||
@ -291,16 +273,4 @@ auto fold(F&& folder, First&& first, Second&& second, Rest&&... rest) {
|
|||||||
#define CONTINUABLE_CONSTEXPR_IF(EXPR, TRUE_BRANCH, FALSE_BRANCH)
|
#define CONTINUABLE_CONSTEXPR_IF(EXPR, TRUE_BRANCH, FALSE_BRANCH)
|
||||||
#endif // CONTINUABLE_CONSTEXPR_IF
|
#endif // CONTINUABLE_CONSTEXPR_IF
|
||||||
|
|
||||||
#ifdef CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION
|
|
||||||
#define CONTINUABLE_FOLD_EXPRESSION(OP, PACK) (... OP PACK)
|
|
||||||
#else
|
|
||||||
#define CONTINUABLE_FOLD_EXPRESSION(OP, PACK) \
|
|
||||||
cti::detail::util::emulation::fold( \
|
|
||||||
[](auto&& left, auto&& right) { \
|
|
||||||
return std::forward<decltype(left)>(left) \
|
|
||||||
OP std::forward<decltype(right)>(right); \
|
|
||||||
}, \
|
|
||||||
PACK)
|
|
||||||
#endif // CONTINUABLE_HAS_CXX17_FOLD_EXPRESSION
|
|
||||||
|
|
||||||
#endif // CONTINUABLE_DETAIL_UTIL_HPP_INCLUDED
|
#endif // CONTINUABLE_DETAIL_UTIL_HPP_INCLUDED
|
||||||
|
|||||||
@ -23,7 +23,9 @@
|
|||||||
|
|
||||||
#include <test-continuable.hpp>
|
#include <test-continuable.hpp>
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
using namespace cti;
|
using namespace cti;
|
||||||
using namespace cti::detail;
|
using namespace cti::detail;
|
||||||
@ -39,7 +41,10 @@ TEST(regression_tests, are_multiple_args_mergeable) {
|
|||||||
std::make_tuple(1, 2, 3, 4));
|
std::make_tuple(1, 2, 3, 4));
|
||||||
|
|
||||||
auto count = traits::unpack(tp2, [](auto... args) {
|
auto count = traits::unpack(tp2, [](auto... args) {
|
||||||
return CONTINUABLE_FOLD_EXPRESSION(+, args...);
|
std::vector<int> v{args...};
|
||||||
|
int c = 0;
|
||||||
|
std::count(v.begin(), v.end(), c);
|
||||||
|
return c;
|
||||||
});
|
});
|
||||||
EXPECT_EQ(count, 20);
|
EXPECT_EQ(count, 20);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user