10#ifndef XTENSOR_XSET_OPERATION_HPP
11#define XTENSOR_XSET_OPERATION_HPP
17#include <xtl/xsequence.hpp>
19#include "../containers/xscalar.hpp"
20#include "../core/xfunction.hpp"
21#include "../core/xmath.hpp"
22#include "../core/xstrides.hpp"
23#include "../utils/xutils.hpp"
24#include "../views/xstrided_view.hpp"
32 template <
bool lvalue>
36 static auto make(E&& e)
38 return [&e](
const auto& t)
40 return std::find(e.begin(), e.end(), t) != e.end();
46 struct lambda_isin<false>
49 static auto make(E&& e)
51 return [e](
const auto& t)
53 return std::find(e.begin(), e.end(), t) != e.end();
70 template <
class E,
class T>
71 inline auto isin(E&& element, std::initializer_list<T> test_elements)
noexcept
73 auto lambda = [test_elements](
const auto& t)
75 return std::find(test_elements.begin(), test_elements.end(), t) != test_elements.end();
90 template <
class E,
class F>
91 inline auto isin(E&& element, F&& test_elements)
noexcept
94 auto lambda = detail::lambda_isin<std::is_lvalue_reference<F>::value>::make(std::forward<F>(test_elements
110 template <
class E, iterator_concept I>
111 inline auto isin(E&& element, I&& test_elements_begin, I&& test_elements_end)
noexcept
113 auto lambda = [&test_elements_begin, &test_elements_end](
const auto& t)
115 return std::find(test_elements_begin, test_elements_end, t) != test_elements_end;
130 template <
class E,
class T>
131 inline auto in1d(E&& element, std::initializer_list<T> test_elements)
noexcept
133 XTENSOR_ASSERT(element.dimension() == 1ul);
134 return isin(std::forward<E>(element), std::forward<std::initializer_list<T>>(test_elements));
147 template <
class E,
class F>
148 inline auto in1d(E&& element, F&& test_elements)
noexcept
151 XTENSOR_ASSERT(element.dimension() == 1ul);
152 XTENSOR_ASSERT(test_elements.dimension() == 1ul);
153 return isin(std::forward<E>(element), std::forward<F>(test_elements));
167 template <
class E, iterator_concept I>
168 inline auto in1d(E&& element, I&& test_elements_begin, I&& test_elements_end)
noexcept
170 XTENSOR_ASSERT(element.dimension() == 1ul);
172 std::forward<E>(element),
173 std::forward<I>(test_elements_begin),
174 std::forward<I>(test_elements_end)
187 template <
class E1,
class E2>
190 XTENSOR_ASSERT(std::is_sorted(a.cbegin(), a.cend()));
196 for (
size_t i = 0; i < v.size(); ++i)
198 out(i) =
static_cast<std::size_t
>(std::lower_bound(a.cbegin(), a.cend(), v(i)) - a.cbegin());
203 for (
size_t i = 0; i < v.size(); ++i)
205 out(i) =
static_cast<std::size_t
>(std::upper_bound(a.cbegin(), a.cend(), v(i)) - a.cbegin());
auto in1d(E &&element, std::initializer_list< T > test_elements) noexcept
in1d
auto isin(E &&element, std::initializer_list< T > test_elements) noexcept
isin
standard mathematical functions for xexpressions
auto make_lambda_xfunction(F &&lambda, E &&... args)
Create a xfunction from a lambda.
auto searchsorted(E1 &&a, E2 &&v, bool right=true)
Find indices where elements should be inserted to maintain order.
xarray< T, L > empty(const S &shape)
Create a xcontainer (xarray, xtensor or xtensor_fixed) with uninitialized values of with value_type T...