diff --git a/include/flux/core/assert.hpp b/include/flux/core/assert.hpp index e8951d3a..8493a7e7 100644 --- a/include/flux/core/assert.hpp +++ b/include/flux/core/assert.hpp @@ -16,6 +16,7 @@ namespace flux { +FLUX_EXPORT struct unrecoverable_error : std::logic_error { explicit unrecoverable_error(char const* msg) : std::logic_error(msg) {} }; @@ -44,7 +45,7 @@ struct runtime_error_fn { } -inline constexpr auto runtime_error = detail::runtime_error_fn{}; +FLUX_EXPORT inline constexpr auto runtime_error = detail::runtime_error_fn{}; namespace detail { @@ -71,8 +72,8 @@ struct bounds_check_fn { } // namespace detail -inline constexpr auto assert_ = detail::assert_fn{}; -inline constexpr auto bounds_check = detail::bounds_check_fn{}; +FLUX_EXPORT inline constexpr auto assert_ = detail::assert_fn{}; +FLUX_EXPORT inline constexpr auto bounds_check = detail::bounds_check_fn{}; #define FLUX_ASSERT(cond) (::flux::assert_(cond, "assertion '" #cond "' failed")) diff --git a/include/flux/core/concepts.hpp b/include/flux/core/concepts.hpp index 80b71ff0..dac180cf 100644 --- a/include/flux/core/concepts.hpp +++ b/include/flux/core/concepts.hpp @@ -25,12 +25,15 @@ namespace flux { /* * Cursor concepts */ +FLUX_EXPORT template concept cursor = std::movable; +FLUX_EXPORT template concept regular_cursor = cursor && std::regular; +FLUX_EXPORT template concept ordered_cursor = regular_cursor && @@ -40,6 +43,7 @@ concept ordered_cursor = * Sequence concepts and associated types */ +FLUX_EXPORT template struct sequence_traits; @@ -50,9 +54,11 @@ using traits_t = sequence_traits>; } // namespace detail +FLUX_EXPORT template using cursor_t = decltype(detail::traits_t::first(FLUX_DECLVAL(Seq&))); +FLUX_EXPORT template using element_t = decltype(detail::traits_t::read_at(FLUX_DECLVAL(Seq&), FLUX_DECLVAL(cursor_t const&))); @@ -93,19 +99,25 @@ struct rvalue_element_type { } // namespace detail +FLUX_EXPORT template using value_t = typename detail::value_type::type; +FLUX_EXPORT using distance_t = flux::config::int_type; +FLUX_EXPORT using index_t = flux::config::int_type; +FLUX_EXPORT template using rvalue_element_t = typename detail::rvalue_element_type::type; +FLUX_EXPORT template using common_element_t = std::common_reference_t, value_t&>; +FLUX_EXPORT template using const_element_t = std::common_reference_t const&&, element_t>; @@ -144,6 +156,7 @@ concept sequence_concept = } // namespace detail +FLUX_EXPORT template concept sequence = detail::sequence_concept; @@ -159,6 +172,7 @@ inline constexpr bool disable_multipass = T::disable_multipass; } // namespace detail +FLUX_EXPORT template concept multipass_sequence = sequence && regular_cursor> && @@ -175,6 +189,7 @@ concept bidirectional_sequence_concept = } // namespace detail +FLUX_EXPORT template concept bidirectional_sequence = detail::bidirectional_sequence_concept; @@ -192,6 +207,7 @@ concept random_access_sequence_concept = } // namespace detail +FLUX_EXPORT template concept random_access_sequence = detail::random_access_sequence_concept; @@ -208,6 +224,7 @@ concept contiguous_sequence_concept = } // namespace detail +FLUX_EXPORT template concept contiguous_sequence = detail::contiguous_sequence_concept; @@ -222,6 +239,7 @@ concept bounded_sequence_concept = } // namespace detail +FLUX_EXPORT template concept bounded_sequence = detail::bounded_sequence_concept; @@ -238,9 +256,11 @@ concept sized_sequence_concept = } // namespace detail +FLUX_EXPORT template concept sized_sequence = detail::sized_sequence_concept; +FLUX_EXPORT template concept writable_sequence_of = sequence && @@ -260,11 +280,13 @@ inline constexpr bool is_infinite_seq = T::is_infinite; } +FLUX_EXPORT template concept infinite_sequence = sequence && detail::is_infinite_seq>; +FLUX_EXPORT template concept read_only_sequence = sequence && @@ -292,6 +314,7 @@ concept trivially_copyable_sequence = } +FLUX_EXPORT template concept adaptable_sequence = (detail::rvalue_sequence diff --git a/include/flux/core/config.hpp b/include/flux/core/config.hpp index 908def79..14e6c701 100644 --- a/include/flux/core/config.hpp +++ b/include/flux/core/config.hpp @@ -6,6 +6,8 @@ #ifndef FLUX_CORE_CONFIG_HPP_INCLUDED #define FLUX_CORE_CONFIG_HPP_INCLUDED +#include + #include #include #include @@ -71,11 +73,13 @@ namespace flux { +FLUX_EXPORT enum class error_policy { terminate = FLUX_ERROR_POLICY_TERMINATE, unwind = FLUX_ERROR_POLICY_UNWIND }; +FLUX_EXPORT enum class overflow_policy { ignore = FLUX_OVERFLOW_POLICY_IGNORE, wrap = FLUX_OVERFLOW_POLICY_WRAP, @@ -84,16 +88,21 @@ enum class overflow_policy { namespace config { +FLUX_EXPORT using int_type = FLUX_INT_TYPE; static_assert(std::signed_integral && (sizeof(int_type) >= sizeof(std::ptrdiff_t)), "Custom FLUX_INT_TYPE must be a signed integer type at least as large as ptrdiff_t"); +FLUX_EXPORT inline constexpr error_policy on_error = static_cast(FLUX_ERROR_POLICY); +FLUX_EXPORT inline constexpr overflow_policy on_overflow = static_cast(FLUX_OVERFLOW_POLICY); +FLUX_EXPORT inline constexpr bool print_error_on_terminate = FLUX_PRINT_ERROR_ON_TERMINATE; +FLUX_EXPORT inline constexpr bool enable_debug_asserts = FLUX_ENABLE_DEBUG_ASSERTS; } // namespace config diff --git a/include/flux/core/functional.hpp b/include/flux/core/functional.hpp index b5d0af99..5ff0dc6c 100644 --- a/include/flux/core/functional.hpp +++ b/include/flux/core/functional.hpp @@ -13,6 +13,7 @@ namespace flux { +FLUX_EXPORT template struct proj { Fn fn; @@ -38,6 +39,7 @@ struct proj { template proj(F, P = {}) -> proj; +FLUX_EXPORT template struct proj2 { Fn fn; @@ -120,7 +122,7 @@ struct unpack_fn { } // namespace detail -inline constexpr auto unpack = detail::unpack_fn{}; +FLUX_EXPORT inline constexpr auto unpack = detail::unpack_fn{}; namespace pred { @@ -142,7 +144,7 @@ inline constexpr auto cmp = [](auto&& val) { } // namespace detail /// Given a predicate, returns a new predicate with the condition reversed -inline constexpr auto not_ = [](auto&& pred) { +FLUX_EXPORT inline constexpr auto not_ = [](auto&& pred) { return detail::predicate([p = FLUX_FWD(pred)] (auto const&... args) { return !std::invoke(p, FLUX_FWD(args)...); }); @@ -153,7 +155,7 @@ inline constexpr auto not_ = [](auto&& pred) { /// /// The returned predicate is short-circuiting: if the first predicate returns /// `false`, the second will not be evaluated. -inline constexpr auto both = [](auto&& p, auto&& and_) { +FLUX_EXPORT inline constexpr auto both = [](auto&& p, auto&& and_) { return detail::predicate{[p1 = FLUX_FWD(p), p2 = FLUX_FWD(and_)] (auto const&... args) { return std::invoke(p1, args...) && std::invoke(p2, args...); }}; @@ -164,7 +166,7 @@ inline constexpr auto both = [](auto&& p, auto&& and_) { /// /// The returned predicate is short-circuiting: if the first predicate returns /// `true`, the second will not be evaluated -inline constexpr auto either = [](auto&& p, auto&& or_) { +FLUX_EXPORT inline constexpr auto either = [](auto&& p, auto&& or_) { return detail::predicate{[p1 = FLUX_FWD(p), p2 = FLUX_FWD(or_)] (auto const&... args) { return std::invoke(p1, args...) || std::invoke(p2, args...); }}; @@ -197,55 +199,55 @@ constexpr auto operator||(detail::predicate lhs, detail::predicate rhs) /// /// The returned predicate is short-circuiting: if the first predicate returns /// `true`, the second will not be evaluated. -inline constexpr auto neither = [](auto&& p1, auto&& nor) { +FLUX_EXPORT inline constexpr auto neither = [](auto&& p1, auto&& nor) { return not_(either(FLUX_FWD(p1), FLUX_FWD(nor))); }; -inline constexpr auto eq = detail::cmp; -inline constexpr auto neq = detail::cmp; -inline constexpr auto lt = detail::cmp; -inline constexpr auto gt = detail::cmp; -inline constexpr auto leq = detail::cmp; -inline constexpr auto geq = detail::cmp; +FLUX_EXPORT inline constexpr auto eq = detail::cmp; +FLUX_EXPORT inline constexpr auto neq = detail::cmp; +FLUX_EXPORT inline constexpr auto lt = detail::cmp; +FLUX_EXPORT inline constexpr auto gt = detail::cmp; +FLUX_EXPORT inline constexpr auto leq = detail::cmp; +FLUX_EXPORT inline constexpr auto geq = detail::cmp; /// A predicate which always returns true -inline constexpr auto true_ = detail::predicate{[](auto const&...) -> bool { return true; }}; +FLUX_EXPORT inline constexpr auto true_ = detail::predicate{[](auto const&...) -> bool { return true; }}; /// A predicate which always returns false -inline constexpr auto false_ = detail::predicate{[](auto const&...) -> bool { return false; }}; +FLUX_EXPORT inline constexpr auto false_ = detail::predicate{[](auto const&...) -> bool { return false; }}; /// Identity predicate, returns the boolean value given to it -inline constexpr auto id = detail::predicate{[](bool b) -> bool { return b; }}; +FLUX_EXPORT inline constexpr auto id = detail::predicate{[](bool b) -> bool { return b; }}; /// Returns true if the given value is greater than a zero of the same type. -inline constexpr auto positive = detail::predicate{[](auto const& val) -> bool { +FLUX_EXPORT inline constexpr auto positive = detail::predicate{[](auto const& val) -> bool { return val > decltype(val){0}; }}; /// Returns true if the given value is less than a zero of the same type. -inline constexpr auto negative = detail::predicate{[](auto const& val) -> bool { +FLUX_EXPORT inline constexpr auto negative = detail::predicate{[](auto const& val) -> bool { return val < decltype(val){0}; }}; /// Returns true if the given value is not equal to a zero of the same type. -inline constexpr auto nonzero = detail::predicate{[](auto const& val) -> bool { +FLUX_EXPORT inline constexpr auto nonzero = detail::predicate{[](auto const& val) -> bool { return val != decltype(val){0}; }}; /// Given a sequence of values, constructs a predicate which returns true /// if its argument compares equal to one of the values -inline constexpr auto in = [](auto const&... vals) requires (sizeof...(vals) > 0) +FLUX_EXPORT inline constexpr auto in = [](auto const&... vals) requires (sizeof...(vals) > 0) { return detail::predicate{[vals...](auto const& arg) -> bool { return ((arg == vals) || ...); }}; }; -inline constexpr auto even = detail::predicate([](auto const& val) -> bool { +FLUX_EXPORT inline constexpr auto even = detail::predicate([](auto const& val) -> bool { return val % decltype(val){2} == decltype(val){0}; }); -inline constexpr auto odd = detail::predicate([](auto const& val) -> bool { +FLUX_EXPORT inline constexpr auto odd = detail::predicate([](auto const& val) -> bool { return val % decltype(val){2} != decltype(val){0}; }); diff --git a/include/flux/core/inline_sequence_base.hpp b/include/flux/core/inline_sequence_base.hpp index 2d66128f..1205e3b4 100644 --- a/include/flux/core/inline_sequence_base.hpp +++ b/include/flux/core/inline_sequence_base.hpp @@ -12,6 +12,7 @@ namespace flux { +FLUX_EXPORT template struct bounds { FLUX_NO_UNIQUE_ADDRESS Cur from; @@ -23,6 +24,7 @@ struct bounds { template bounds(Cur, Cur) -> bounds; +FLUX_EXPORT template using bounds_t = bounds>; diff --git a/include/flux/core/macros.hpp b/include/flux/core/macros.hpp index 0b19cf49..69d32203 100644 --- a/include/flux/core/macros.hpp +++ b/include/flux/core/macros.hpp @@ -27,4 +27,10 @@ ::flux::inc(_flux_seq_, _flux_cur_)) \ if (_flux_var_decl_ = ::flux::read_at(_flux_seq_, _flux_cur_); true) +#ifdef FLUX_MODULE_INTERFACE +#define FLUX_EXPORT export +#else +#define FLUX_EXPORT +#endif + #endif // FLUX_CORE_MACROS_HPP_INCLUDED diff --git a/include/flux/core/numeric.hpp b/include/flux/core/numeric.hpp index 42d6f2c2..0fd4d310 100644 --- a/include/flux/core/numeric.hpp +++ b/include/flux/core/numeric.hpp @@ -12,18 +12,21 @@ namespace flux::num { +FLUX_EXPORT inline constexpr auto wrapping_add = [](T lhs, T rhs) -> T { using U = std::make_unsigned_t; return static_cast(static_cast(lhs) + static_cast(rhs)); }; +FLUX_EXPORT inline constexpr auto wrapping_sub = [](T lhs, T rhs) -> T { using U = std::make_unsigned_t; return static_cast(static_cast(lhs) - static_cast(rhs)); }; +FLUX_EXPORT inline constexpr auto wrapping_mul = [](T lhs, T rhs) -> T { using U = std::make_unsigned_t; @@ -50,12 +53,14 @@ namespace detail { } +FLUX_EXPORT template struct overflow_result { T value; bool overflowed; }; +FLUX_EXPORT inline constexpr auto overflowing_add = [](T lhs, T rhs) -> overflow_result { @@ -69,6 +74,7 @@ inline constexpr auto overflowing_add = [](T lhs, T rhs) } }; +FLUX_EXPORT inline constexpr auto overflowing_sub = [](T lhs, T rhs) -> overflow_result { @@ -83,6 +89,7 @@ inline constexpr auto overflowing_sub = [](T lhs, T rhs) } }; +FLUX_EXPORT inline constexpr auto overflowing_mul = [](T lhs, T rhs) -> overflow_result { @@ -95,6 +102,7 @@ inline constexpr auto overflowing_mul = [](T lhs, T rhs) } }; +FLUX_EXPORT inline constexpr auto checked_add = [](T lhs, T rhs, std::source_location loc = std::source_location::current()) @@ -117,6 +125,7 @@ inline constexpr auto checked_add = } }; +FLUX_EXPORT inline constexpr auto checked_sub = [](T lhs, T rhs, std::source_location loc = std::source_location::current()) @@ -139,6 +148,7 @@ inline constexpr auto checked_sub = } }; +FLUX_EXPORT inline constexpr auto checked_mul = [](T lhs, T rhs, std::source_location loc = std::source_location::current()) diff --git a/include/flux/core/optional.hpp b/include/flux/core/optional.hpp index 60e87e7e..c754bd37 100644 --- a/include/flux/core/optional.hpp +++ b/include/flux/core/optional.hpp @@ -14,8 +14,8 @@ namespace flux { -using nullopt_t = std::nullopt_t; -inline constexpr nullopt_t const& nullopt = std::nullopt; +FLUX_EXPORT using nullopt_t = std::nullopt_t; +FLUX_EXPORT inline constexpr nullopt_t const& nullopt = std::nullopt; namespace detail { @@ -27,6 +27,7 @@ concept can_optional = } +FLUX_EXPORT template class optional; diff --git a/include/flux/core/sequence_access.hpp b/include/flux/core/sequence_access.hpp index c662e324..d9b5e622 100644 --- a/include/flux/core/sequence_access.hpp +++ b/include/flux/core/sequence_access.hpp @@ -208,19 +208,19 @@ struct move_at_unchecked_fn { } // namespace detail -inline constexpr auto first = detail::first_fn{}; -inline constexpr auto is_last = detail::is_last_fn{}; -inline constexpr auto read_at = detail::read_at_fn{}; -inline constexpr auto move_at = detail::move_at_fn{}; -inline constexpr auto read_at_unchecked = detail::read_at_unchecked_fn{}; -inline constexpr auto move_at_unchecked = detail::move_at_unchecked_fn{}; -inline constexpr auto inc = detail::inc_fn{}; -inline constexpr auto dec = detail::dec_fn{}; -inline constexpr auto distance = detail::distance_fn{}; -inline constexpr auto data = detail::data_fn{}; -inline constexpr auto last = detail::last_fn{}; -inline constexpr auto size = detail::size_fn{}; -inline constexpr auto usize = detail::usize_fn{}; +FLUX_EXPORT inline constexpr auto first = detail::first_fn{}; +FLUX_EXPORT inline constexpr auto is_last = detail::is_last_fn{}; +FLUX_EXPORT inline constexpr auto read_at = detail::read_at_fn{}; +FLUX_EXPORT inline constexpr auto move_at = detail::move_at_fn{}; +FLUX_EXPORT inline constexpr auto read_at_unchecked = detail::read_at_unchecked_fn{}; +FLUX_EXPORT inline constexpr auto move_at_unchecked = detail::move_at_unchecked_fn{}; +FLUX_EXPORT inline constexpr auto inc = detail::inc_fn{}; +FLUX_EXPORT inline constexpr auto dec = detail::dec_fn{}; +FLUX_EXPORT inline constexpr auto distance = detail::distance_fn{}; +FLUX_EXPORT inline constexpr auto data = detail::data_fn{}; +FLUX_EXPORT inline constexpr auto last = detail::last_fn{}; +FLUX_EXPORT inline constexpr auto size = detail::size_fn{}; +FLUX_EXPORT inline constexpr auto usize = detail::usize_fn{}; namespace detail { @@ -357,13 +357,13 @@ struct back_fn { } // namespace detail -inline constexpr auto next = detail::next_fn{}; -inline constexpr auto prev = detail::prev_fn{}; -inline constexpr auto is_empty = detail::is_empty_fn{}; -inline constexpr auto swap_with = detail::swap_with_fn{}; -inline constexpr auto swap_at = detail::swap_at_fn{}; -inline constexpr auto front = detail::front_fn{}; -inline constexpr auto back = detail::back_fn{}; +FLUX_EXPORT inline constexpr auto next = detail::next_fn{}; +FLUX_EXPORT inline constexpr auto prev = detail::prev_fn{}; +FLUX_EXPORT inline constexpr auto is_empty = detail::is_empty_fn{}; +FLUX_EXPORT inline constexpr auto swap_with = detail::swap_with_fn{}; +FLUX_EXPORT inline constexpr auto swap_at = detail::swap_at_fn{}; +FLUX_EXPORT inline constexpr auto front = detail::front_fn{}; +FLUX_EXPORT inline constexpr auto back = detail::back_fn{}; } // namespace flux diff --git a/include/flux/core/simple_sequence_base.hpp b/include/flux/core/simple_sequence_base.hpp index c16cc6ab..2a61c82c 100644 --- a/include/flux/core/simple_sequence_base.hpp +++ b/include/flux/core/simple_sequence_base.hpp @@ -10,6 +10,7 @@ namespace flux { +FLUX_EXPORT template struct simple_sequence_base : inline_sequence_base {}; diff --git a/include/flux/core/utils.hpp b/include/flux/core/utils.hpp index b623f7ee..c77a725e 100644 --- a/include/flux/core/utils.hpp +++ b/include/flux/core/utils.hpp @@ -22,6 +22,7 @@ namespace flux { /* * Useful helpers */ +FLUX_EXPORT template concept decays_to = std::same_as, To>; @@ -40,7 +41,7 @@ struct copy_fn { } // namespace detail -inline constexpr auto copy = detail::copy_fn{}; +FLUX_EXPORT inline constexpr auto copy = detail::copy_fn{}; namespace detail { @@ -65,6 +66,7 @@ struct checked_cast_fn { } // namespace detail +FLUX_EXPORT template inline constexpr auto checked_cast = detail::checked_cast_fn{}; diff --git a/include/flux/op/adjacent.hpp b/include/flux/op/adjacent.hpp index a0d26174..8e67df2c 100644 --- a/include/flux/op/adjacent.hpp +++ b/include/flux/op/adjacent.hpp @@ -242,17 +242,19 @@ struct adjacent_map_fn { } // namespace detail +FLUX_EXPORT template requires (N > 0) inline constexpr auto adjacent = detail::adjacent_fn{}; -inline constexpr auto pairwise = adjacent<2>; +FLUX_EXPORT inline constexpr auto pairwise = adjacent<2>; +FLUX_EXPORT template requires (N > 0) inline constexpr auto adjacent_map = detail::adjacent_map_fn{}; -inline constexpr auto pairwise_map = adjacent_map<2>; +FLUX_EXPORT inline constexpr auto pairwise_map = adjacent_map<2>; template template diff --git a/include/flux/op/all_any_none.hpp b/include/flux/op/all_any_none.hpp index 272326ba..7937e5e5 100644 --- a/include/flux/op/all_any_none.hpp +++ b/include/flux/op/all_any_none.hpp @@ -26,7 +26,7 @@ struct fn { } // namespace all_detail -inline constexpr auto all = all_detail::fn{}; +FLUX_EXPORT inline constexpr auto all = all_detail::fn{}; namespace none_detail { @@ -43,7 +43,7 @@ struct fn { } // namespace none_detail -inline constexpr auto none = none_detail::fn{}; +FLUX_EXPORT inline constexpr auto none = none_detail::fn{}; namespace any_detail { @@ -60,7 +60,7 @@ struct fn { } // namespace any_detail -inline constexpr auto any = any_detail::fn{}; +FLUX_EXPORT inline constexpr auto any = any_detail::fn{}; template template diff --git a/include/flux/op/begin_end.hpp b/include/flux/op/begin_end.hpp index c2ae4826..2e3be2d6 100644 --- a/include/flux/op/begin_end.hpp +++ b/include/flux/op/begin_end.hpp @@ -201,8 +201,8 @@ struct end_fn { } // namespace detail -inline constexpr auto begin = detail::begin_fn{}; -inline constexpr auto end = detail::end_fn{}; +FLUX_EXPORT inline constexpr auto begin = detail::begin_fn{}; +FLUX_EXPORT inline constexpr auto end = detail::end_fn{}; template constexpr auto inline_sequence_base::begin() & diff --git a/include/flux/op/cache_last.hpp b/include/flux/op/cache_last.hpp index 70363156..92f44407 100644 --- a/include/flux/op/cache_last.hpp +++ b/include/flux/op/cache_last.hpp @@ -77,7 +77,7 @@ struct cache_last_fn { } // namespace detail -inline constexpr auto cache_last = detail::cache_last_fn{}; +FLUX_EXPORT inline constexpr auto cache_last = detail::cache_last_fn{}; template constexpr auto inline_sequence_base::cache_last() && diff --git a/include/flux/op/cartesian_product.hpp b/include/flux/op/cartesian_product.hpp index e3cb3251..82be248c 100644 --- a/include/flux/op/cartesian_product.hpp +++ b/include/flux/op/cartesian_product.hpp @@ -244,7 +244,7 @@ struct sequence_traits> } }; -inline constexpr auto cartesian_product = detail::cartesian_product_fn{}; +FLUX_EXPORT inline constexpr auto cartesian_product = detail::cartesian_product_fn{}; } // end namespace flux diff --git a/include/flux/op/cartesian_product_with.hpp b/include/flux/op/cartesian_product_with.hpp index 6e66934d..5372c5b0 100644 --- a/include/flux/op/cartesian_product_with.hpp +++ b/include/flux/op/cartesian_product_with.hpp @@ -58,9 +58,7 @@ struct cartesian_product_with_fn } // namespace detail - - -inline constexpr auto cartesian_product_with = detail::cartesian_product_with_fn{}; +FLUX_EXPORT inline constexpr auto cartesian_product_with = detail::cartesian_product_with_fn{}; } // namespace flux diff --git a/include/flux/op/chain.hpp b/include/flux/op/chain.hpp index e03b2a17..ed04db5a 100644 --- a/include/flux/op/chain.hpp +++ b/include/flux/op/chain.hpp @@ -323,7 +323,7 @@ struct sequence_traits> { }; -inline constexpr auto chain = detail::chain_fn{}; +FLUX_EXPORT inline constexpr auto chain = detail::chain_fn{}; } // namespace flux diff --git a/include/flux/op/chunk.hpp b/include/flux/op/chunk.hpp index 1cc0e7b0..31690498 100644 --- a/include/flux/op/chunk.hpp +++ b/include/flux/op/chunk.hpp @@ -309,7 +309,7 @@ struct chunk_fn { } // namespace detail -inline constexpr auto chunk = detail::chunk_fn{}; +FLUX_EXPORT inline constexpr auto chunk = detail::chunk_fn{}; template constexpr auto inline_sequence_base::chunk(std::integral auto chunk_sz) && diff --git a/include/flux/op/chunk_by.hpp b/include/flux/op/chunk_by.hpp index fde97524..fda1befb 100644 --- a/include/flux/op/chunk_by.hpp +++ b/include/flux/op/chunk_by.hpp @@ -133,7 +133,7 @@ struct chunk_by_fn { } // namespace detail -inline constexpr auto chunk_by = detail::chunk_by_fn{}; +FLUX_EXPORT inline constexpr auto chunk_by = detail::chunk_by_fn{}; template template diff --git a/include/flux/op/compare.hpp b/include/flux/op/compare.hpp index 3c61c0ef..fff25111 100644 --- a/include/flux/op/compare.hpp +++ b/include/flux/op/compare.hpp @@ -48,7 +48,7 @@ struct compare_fn { } // namespace detail -inline constexpr auto compare = detail::compare_fn{}; +FLUX_EXPORT inline constexpr auto compare = detail::compare_fn{}; } // namespace flux diff --git a/include/flux/op/contains.hpp b/include/flux/op/contains.hpp index 8045d1e1..58b1c05b 100644 --- a/include/flux/op/contains.hpp +++ b/include/flux/op/contains.hpp @@ -27,7 +27,7 @@ struct contains_fn { } // namespace detail -inline constexpr auto contains = detail::contains_fn{}; +FLUX_EXPORT inline constexpr auto contains = detail::contains_fn{}; template template diff --git a/include/flux/op/count.hpp b/include/flux/op/count.hpp index a3a711a2..c4c4e67f 100644 --- a/include/flux/op/count.hpp +++ b/include/flux/op/count.hpp @@ -68,9 +68,9 @@ struct count_if_fn { } // namespace detail -inline constexpr auto count = detail::count_fn{}; -inline constexpr auto count_eq = detail::count_eq_fn{}; -inline constexpr auto count_if = detail::count_if_fn{}; +FLUX_EXPORT inline constexpr auto count = detail::count_fn{}; +FLUX_EXPORT inline constexpr auto count_eq = detail::count_eq_fn{}; +FLUX_EXPORT inline constexpr auto count_if = detail::count_if_fn{}; template constexpr auto inline_sequence_base::count() diff --git a/include/flux/op/cursors.hpp b/include/flux/op/cursors.hpp index 79cd9f03..2f640547 100644 --- a/include/flux/op/cursors.hpp +++ b/include/flux/op/cursors.hpp @@ -92,7 +92,7 @@ struct cursors_fn { } // namespace detail -inline constexpr auto cursors = detail::cursors_fn{}; +FLUX_EXPORT inline constexpr auto cursors = detail::cursors_fn{}; template constexpr auto inline_sequence_base::cursors() && diff --git a/include/flux/op/cycle.hpp b/include/flux/op/cycle.hpp index 01618cad..8023ba57 100644 --- a/include/flux/op/cycle.hpp +++ b/include/flux/op/cycle.hpp @@ -239,7 +239,7 @@ struct cycle_fn { } // namespace detail -inline constexpr auto cycle = detail::cycle_fn{}; +FLUX_EXPORT inline constexpr auto cycle = detail::cycle_fn{}; template constexpr auto inline_sequence_base::cycle() && diff --git a/include/flux/op/drop.hpp b/include/flux/op/drop.hpp index e24522af..b072406f 100644 --- a/include/flux/op/drop.hpp +++ b/include/flux/op/drop.hpp @@ -85,7 +85,7 @@ struct drop_fn { } // namespace detail -inline constexpr auto drop = detail::drop_fn{}; +FLUX_EXPORT inline constexpr auto drop = detail::drop_fn{}; template constexpr auto inline_sequence_base::drop(std::integral auto count) && diff --git a/include/flux/op/drop_while.hpp b/include/flux/op/drop_while.hpp index 0410346f..57f609bb 100644 --- a/include/flux/op/drop_while.hpp +++ b/include/flux/op/drop_while.hpp @@ -72,7 +72,7 @@ struct drop_while_fn { } // namespace detail -inline constexpr auto drop_while = detail::drop_while_fn{}; +FLUX_EXPORT inline constexpr auto drop_while = detail::drop_while_fn{}; template template diff --git a/include/flux/op/ends_with.hpp b/include/flux/op/ends_with.hpp index a5c9d908..6864f36e 100644 --- a/include/flux/op/ends_with.hpp +++ b/include/flux/op/ends_with.hpp @@ -84,7 +84,7 @@ struct ends_with_fn { } // namespace detail -inline constexpr auto ends_with = detail::ends_with_fn{}; +FLUX_EXPORT inline constexpr auto ends_with = detail::ends_with_fn{}; template template diff --git a/include/flux/op/equal.hpp b/include/flux/op/equal.hpp index 7508712e..ec065230 100644 --- a/include/flux/op/equal.hpp +++ b/include/flux/op/equal.hpp @@ -41,7 +41,7 @@ struct equal_fn { } // namespace detail -inline constexpr auto equal = detail::equal_fn{}; +FLUX_EXPORT inline constexpr auto equal = detail::equal_fn{}; } // namespace flux diff --git a/include/flux/op/fill.hpp b/include/flux/op/fill.hpp index b5268a7a..dbce2978 100644 --- a/include/flux/op/fill.hpp +++ b/include/flux/op/fill.hpp @@ -23,7 +23,7 @@ struct fill_fn { } // namespace detail -inline constexpr auto fill = detail::fill_fn{}; +FLUX_EXPORT inline constexpr auto fill = detail::fill_fn{}; template template diff --git a/include/flux/op/filter.hpp b/include/flux/op/filter.hpp index 8fd5ab7e..2bbaa964 100644 --- a/include/flux/op/filter.hpp +++ b/include/flux/op/filter.hpp @@ -123,7 +123,7 @@ struct filter_fn { } // namespace detail -inline constexpr auto filter = detail::filter_fn{}; +FLUX_EXPORT inline constexpr auto filter = detail::filter_fn{}; template template diff --git a/include/flux/op/find.hpp b/include/flux/op/find.hpp index 0f949ad5..86ebd59b 100644 --- a/include/flux/op/find.hpp +++ b/include/flux/op/find.hpp @@ -49,9 +49,9 @@ struct find_if_not_fn { } // namespace detail -inline constexpr auto find = detail::find_fn{}; -inline constexpr auto find_if = detail::find_if_fn{}; -inline constexpr auto find_if_not = detail::find_if_not_fn{}; +FLUX_EXPORT inline constexpr auto find = detail::find_fn{}; +FLUX_EXPORT inline constexpr auto find_if = detail::find_if_fn{}; +FLUX_EXPORT inline constexpr auto find_if_not = detail::find_if_not_fn{}; template template diff --git a/include/flux/op/flatten.hpp b/include/flux/op/flatten.hpp index 6116b926..3b968cf8 100644 --- a/include/flux/op/flatten.hpp +++ b/include/flux/op/flatten.hpp @@ -238,7 +238,7 @@ struct flatten_fn { } // namespace detail -inline constexpr auto flatten = detail::flatten_fn{}; +FLUX_EXPORT inline constexpr auto flatten = detail::flatten_fn{}; template constexpr auto inline_sequence_base::flatten() && diff --git a/include/flux/op/fold.hpp b/include/flux/op/fold.hpp index b81d0146..c42a7c40 100644 --- a/include/flux/op/fold.hpp +++ b/include/flux/op/fold.hpp @@ -82,10 +82,10 @@ struct product_op { } // namespace detail -inline constexpr auto fold = detail::fold_op{}; -inline constexpr auto fold_first = detail::fold_first_op{}; -inline constexpr auto sum = detail::sum_op{}; -inline constexpr auto product = detail::product_op{}; +FLUX_EXPORT inline constexpr auto fold = detail::fold_op{}; +FLUX_EXPORT inline constexpr auto fold_first = detail::fold_first_op{}; +FLUX_EXPORT inline constexpr auto sum = detail::sum_op{}; +FLUX_EXPORT inline constexpr auto product = detail::product_op{}; template template diff --git a/include/flux/op/for_each.hpp b/include/flux/op/for_each.hpp index c5221d38..82f05bec 100644 --- a/include/flux/op/for_each.hpp +++ b/include/flux/op/for_each.hpp @@ -29,7 +29,7 @@ struct for_each_fn { } // namespace detail -inline constexpr auto for_each = detail::for_each_fn{}; +FLUX_EXPORT inline constexpr auto for_each = detail::for_each_fn{}; template template diff --git a/include/flux/op/for_each_while.hpp b/include/flux/op/for_each_while.hpp index d91356d3..ee1de7e8 100644 --- a/include/flux/op/for_each_while.hpp +++ b/include/flux/op/for_each_while.hpp @@ -33,7 +33,7 @@ struct for_each_while_fn { } // namespace detail -inline constexpr auto for_each_while = detail::for_each_while_fn{}; +FLUX_EXPORT inline constexpr auto for_each_while = detail::for_each_while_fn{}; template template diff --git a/include/flux/op/from.hpp b/include/flux/op/from.hpp index b9c0d057..7ccd4a95 100644 --- a/include/flux/op/from.hpp +++ b/include/flux/op/from.hpp @@ -46,8 +46,8 @@ struct from_fwd_ref_fn { } // namespace detail -inline constexpr auto from = detail::from_fn{}; -inline constexpr auto from_fwd_ref = detail::from_fwd_ref_fn{}; +FLUX_EXPORT inline constexpr auto from = detail::from_fn{}; +FLUX_EXPORT inline constexpr auto from_fwd_ref = detail::from_fwd_ref_fn{}; } // namespace flux diff --git a/include/flux/op/inplace_reverse.hpp b/include/flux/op/inplace_reverse.hpp index 43e1be91..39dc7621 100644 --- a/include/flux/op/inplace_reverse.hpp +++ b/include/flux/op/inplace_reverse.hpp @@ -30,7 +30,7 @@ struct inplace_reverse_fn { } // namespace detail -inline constexpr auto inplace_reverse = detail::inplace_reverse_fn{}; +FLUX_EXPORT inline constexpr auto inplace_reverse = detail::inplace_reverse_fn{}; template constexpr auto inline_sequence_base::inplace_reverse() diff --git a/include/flux/op/map.hpp b/include/flux/op/map.hpp index ea5ad786..8d1d7346 100644 --- a/include/flux/op/map.hpp +++ b/include/flux/op/map.hpp @@ -73,7 +73,7 @@ struct map_fn { } // namespace detail -inline constexpr auto map = detail::map_fn{}; +FLUX_EXPORT inline constexpr auto map = detail::map_fn{}; template template diff --git a/include/flux/op/mask.hpp b/include/flux/op/mask.hpp index f3f5fc3f..00cd9478 100644 --- a/include/flux/op/mask.hpp +++ b/include/flux/op/mask.hpp @@ -153,7 +153,7 @@ struct mask_fn { } // namespace detail -inline constexpr auto mask = detail::mask_fn{}; +FLUX_EXPORT inline constexpr auto mask = detail::mask_fn{}; template template diff --git a/include/flux/op/minmax.hpp b/include/flux/op/minmax.hpp index 71e08287..df7fd9a3 100644 --- a/include/flux/op/minmax.hpp +++ b/include/flux/op/minmax.hpp @@ -12,6 +12,7 @@ namespace flux { +FLUX_EXPORT template struct minmax_result { T min; @@ -85,9 +86,9 @@ struct minmax_op { } // namespace detail -inline constexpr auto min = detail::min_op{}; -inline constexpr auto max = detail::max_op{}; -inline constexpr auto minmax = detail::minmax_op{}; +FLUX_EXPORT inline constexpr auto min = detail::min_op{}; +FLUX_EXPORT inline constexpr auto max = detail::max_op{}; +FLUX_EXPORT inline constexpr auto minmax = detail::minmax_op{}; template template diff --git a/include/flux/op/output_to.hpp b/include/flux/op/output_to.hpp index 49c293cd..cf8e9ada 100644 --- a/include/flux/op/output_to.hpp +++ b/include/flux/op/output_to.hpp @@ -54,7 +54,7 @@ struct output_to_fn { } -inline constexpr auto output_to = detail::output_to_fn{}; +FLUX_EXPORT inline constexpr auto output_to = detail::output_to_fn{}; template template diff --git a/include/flux/op/read_only.hpp b/include/flux/op/read_only.hpp index 33f9b504..289665c3 100644 --- a/include/flux/op/read_only.hpp +++ b/include/flux/op/read_only.hpp @@ -57,7 +57,7 @@ struct read_only_fn { } // namespace detail -inline constexpr auto read_only = detail::read_only_fn{}; +FLUX_EXPORT inline constexpr auto read_only = detail::read_only_fn{}; template constexpr auto inline_sequence_base::read_only() && diff --git a/include/flux/op/ref.hpp b/include/flux/op/ref.hpp index 79a807ee..bcf9b79f 100644 --- a/include/flux/op/ref.hpp +++ b/include/flux/op/ref.hpp @@ -213,8 +213,8 @@ struct ref_fn { } // namespace detail -inline constexpr auto mut_ref = detail::mut_ref_fn{}; -inline constexpr auto ref = detail::ref_fn{}; +FLUX_EXPORT inline constexpr auto mut_ref = detail::mut_ref_fn{}; +FLUX_EXPORT inline constexpr auto ref = detail::ref_fn{}; template constexpr auto inline_sequence_base::ref() const& diff --git a/include/flux/op/requirements.hpp b/include/flux/op/requirements.hpp index 0fb51e26..21bcf57e 100644 --- a/include/flux/op/requirements.hpp +++ b/include/flux/op/requirements.hpp @@ -10,6 +10,7 @@ namespace flux { +FLUX_EXPORT template using fold_result_t = std::decay_t>>; @@ -24,12 +25,14 @@ concept foldable_ = } // namespace detail +FLUX_EXPORT template concept foldable = sequence && std::invocable> && detail::foldable_; +FLUX_EXPORT template concept strict_weak_order_for = sequence && diff --git a/include/flux/op/reverse.hpp b/include/flux/op/reverse.hpp index a56f3c28..3d68f1b2 100644 --- a/include/flux/op/reverse.hpp +++ b/include/flux/op/reverse.hpp @@ -154,7 +154,7 @@ struct reverse_fn { } // namespace detail -inline constexpr auto reverse = detail::reverse_fn{}; +FLUX_EXPORT inline constexpr auto reverse = detail::reverse_fn{}; template constexpr auto inline_sequence_base::reverse() && diff --git a/include/flux/op/scan.hpp b/include/flux/op/scan.hpp index 388e1b86..65aaa9e8 100644 --- a/include/flux/op/scan.hpp +++ b/include/flux/op/scan.hpp @@ -177,8 +177,8 @@ struct prescan_fn { } // namespace detail -inline constexpr auto scan = detail::scan_fn{}; -inline constexpr auto prescan = detail::prescan_fn{}; +FLUX_EXPORT inline constexpr auto scan = detail::scan_fn{}; +FLUX_EXPORT inline constexpr auto prescan = detail::prescan_fn{}; template template diff --git a/include/flux/op/scan_first.hpp b/include/flux/op/scan_first.hpp index 2d3d13de..1d9a555e 100644 --- a/include/flux/op/scan_first.hpp +++ b/include/flux/op/scan_first.hpp @@ -126,7 +126,7 @@ struct scan_first_fn { } // namespace detail -inline constexpr auto scan_first = detail::scan_first_fn{}; +FLUX_EXPORT inline constexpr auto scan_first = detail::scan_first_fn{}; template template diff --git a/include/flux/op/search.hpp b/include/flux/op/search.hpp index 6e7cd6e0..07762017 100644 --- a/include/flux/op/search.hpp +++ b/include/flux/op/search.hpp @@ -50,7 +50,7 @@ struct search_fn { } // namespace detail -inline constexpr auto search = detail::search_fn{}; +FLUX_EXPORT inline constexpr auto search = detail::search_fn{}; } // namespace flux diff --git a/include/flux/op/set_adaptors.hpp b/include/flux/op/set_adaptors.hpp index 6c59a2e8..beb9d41d 100644 --- a/include/flux/op/set_adaptors.hpp +++ b/include/flux/op/set_adaptors.hpp @@ -557,10 +557,10 @@ struct set_intersection_fn { namespace flux { -inline constexpr auto set_union = detail::set_union_fn{}; -inline constexpr auto set_difference = detail::set_difference_fn{}; -inline constexpr auto set_symmetric_difference = detail::set_symmetric_difference_fn{}; -inline constexpr auto set_intersection = detail::set_intersection_fn{}; +FLUX_EXPORT inline constexpr auto set_union = detail::set_union_fn{}; +FLUX_EXPORT inline constexpr auto set_difference = detail::set_difference_fn{}; +FLUX_EXPORT inline constexpr auto set_symmetric_difference = detail::set_symmetric_difference_fn{}; +FLUX_EXPORT inline constexpr auto set_intersection = detail::set_intersection_fn{}; } // namespace flux diff --git a/include/flux/op/slice.hpp b/include/flux/op/slice.hpp index 17dce88a..a3819fbc 100644 --- a/include/flux/op/slice.hpp +++ b/include/flux/op/slice.hpp @@ -138,7 +138,7 @@ struct sequence_traits> void for_each_while() = delete; }; -inline constexpr auto slice = detail::slice_fn{}; +FLUX_EXPORT inline constexpr auto slice = detail::slice_fn{}; #if 0 template diff --git a/include/flux/op/slide.hpp b/include/flux/op/slide.hpp index e04a9ef5..251ee70c 100644 --- a/include/flux/op/slide.hpp +++ b/include/flux/op/slide.hpp @@ -125,7 +125,7 @@ struct slide_fn { } // namespace detail -inline constexpr auto slide = detail::slide_fn{}; +FLUX_EXPORT inline constexpr auto slide = detail::slide_fn{}; template constexpr auto inline_sequence_base::slide(std::integral auto win_sz) && diff --git a/include/flux/op/sort.hpp b/include/flux/op/sort.hpp index 8bc1529b..939067f1 100644 --- a/include/flux/op/sort.hpp +++ b/include/flux/op/sort.hpp @@ -24,7 +24,7 @@ struct sort_fn { } // namespace detail -inline constexpr auto sort = detail::sort_fn{}; +FLUX_EXPORT inline constexpr auto sort = detail::sort_fn{}; template template diff --git a/include/flux/op/split.hpp b/include/flux/op/split.hpp index 79ad4105..100e3667 100644 --- a/include/flux/op/split.hpp +++ b/include/flux/op/split.hpp @@ -128,7 +128,7 @@ struct sequence_traits> } }; -inline constexpr auto split = detail::split_fn{}; +FLUX_EXPORT inline constexpr auto split = detail::split_fn{}; template template diff --git a/include/flux/op/split_string.hpp b/include/flux/op/split_string.hpp index 9e85360a..52073eb0 100644 --- a/include/flux/op/split_string.hpp +++ b/include/flux/op/split_string.hpp @@ -60,7 +60,7 @@ struct split_string_fn { } // namespace detail -inline constexpr auto split_string = detail::split_string_fn{}; +FLUX_EXPORT inline constexpr auto split_string = detail::split_string_fn{}; template constexpr auto inline_sequence_base::split_string(auto&& pattern) && diff --git a/include/flux/op/starts_with.hpp b/include/flux/op/starts_with.hpp index ceb1ab89..c7282656 100644 --- a/include/flux/op/starts_with.hpp +++ b/include/flux/op/starts_with.hpp @@ -40,7 +40,7 @@ struct starts_with_fn { } // namespace detail -inline constexpr auto starts_with = detail::starts_with_fn{}; +FLUX_EXPORT inline constexpr auto starts_with = detail::starts_with_fn{}; template template diff --git a/include/flux/op/stride.hpp b/include/flux/op/stride.hpp index 5d7d9363..237839d8 100644 --- a/include/flux/op/stride.hpp +++ b/include/flux/op/stride.hpp @@ -261,7 +261,7 @@ struct stride_fn { } // namespace detail -inline constexpr auto stride = detail::stride_fn{}; +FLUX_EXPORT inline constexpr auto stride = detail::stride_fn{}; template constexpr auto inline_sequence_base::stride(std::integral auto by) && diff --git a/include/flux/op/swap_elements.hpp b/include/flux/op/swap_elements.hpp index 5a438ec9..4e629b65 100644 --- a/include/flux/op/swap_elements.hpp +++ b/include/flux/op/swap_elements.hpp @@ -30,7 +30,7 @@ struct swap_elements_fn { } -inline constexpr auto swap_elements = detail::swap_elements_fn{}; +FLUX_EXPORT inline constexpr auto swap_elements = detail::swap_elements_fn{}; } diff --git a/include/flux/op/take.hpp b/include/flux/op/take.hpp index a93d9e7f..ceea2d20 100644 --- a/include/flux/op/take.hpp +++ b/include/flux/op/take.hpp @@ -161,7 +161,7 @@ struct take_fn { } // namespace detail -inline constexpr auto take = detail::take_fn{}; +FLUX_EXPORT inline constexpr auto take = detail::take_fn{}; template constexpr auto inline_sequence_base::take(std::integral auto count) && diff --git a/include/flux/op/take_while.hpp b/include/flux/op/take_while.hpp index fd6ad747..05eedd19 100644 --- a/include/flux/op/take_while.hpp +++ b/include/flux/op/take_while.hpp @@ -84,7 +84,7 @@ struct sequence_traits> } }; -inline constexpr auto take_while = detail::take_while_fn{}; +FLUX_EXPORT inline constexpr auto take_while = detail::take_while_fn{}; template template diff --git a/include/flux/op/to.hpp b/include/flux/op/to.hpp index bfa6f1b7..1d393a22 100644 --- a/include/flux/op/to.hpp +++ b/include/flux/op/to.hpp @@ -117,6 +117,7 @@ using deduced_container_t = typename decltype(deduce_container_type requires (std::convertible_to, detail::container_value_t> && detail::container_convertible) || @@ -147,6 +148,7 @@ constexpr auto to(Seq&& seq, Args&&... args) -> Container } } +FLUX_EXPORT template