Skip to content

Commit e08a693

Browse files
committed
Add expression re-ordering to allow linear assignment
1 parent 9d9e0cb commit e08a693

File tree

3 files changed

+40
-6
lines changed

3 files changed

+40
-6
lines changed

include/xtensor/xview.hpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "xtensor.hpp"
3333
#include "xtensor_config.hpp"
3434
#include "xtensor_forward.hpp"
35+
#include "xutils.hpp"
3536
#include "xview_utils.hpp"
3637

3738
namespace xt
@@ -1821,6 +1822,38 @@ namespace xt
18211822
}
18221823
}
18231824

1825+
namespace detail
1826+
{
1827+
template <class E1, class E2>
1828+
struct equal_rank
1829+
{
1830+
static constexpr bool value = get_rank<E1>::value == get_rank<E2>::value;
1831+
};
1832+
1833+
template <class E1, class... E>
1834+
struct all_equal_rank
1835+
{
1836+
static constexpr bool value = xtl::conjunction<equal_rank<E1, E>...>::value
1837+
&& (get_rank<E1>::value != SIZE_MAX);
1838+
};
1839+
1840+
template <class op, class... E, class... S, size_t... I>
1841+
inline auto impl_reorder_function(xfunction<op, E...> e, std::index_sequence<I...>, S&&... slices)
1842+
{
1843+
return detail::make_xfunction<op>(view(std::get<I>(e.arguments()), std::forward<S>(slices)...)...);
1844+
}
1845+
}
1846+
1847+
template <class op, class... E, class... S, class = std::enable_if_t<detail::all_equal_rank<std::decay_t<E>...>::value>>
1848+
inline auto view(xfunction<op, E...> e, S&&... slices)
1849+
{
1850+
return detail::impl_reorder_function(
1851+
e,
1852+
std::make_index_sequence<sizeof...(E)>(),
1853+
std::forward<S>(slices)...
1854+
);
1855+
}
1856+
18241857
/**
18251858
* Constructs and returns a view on the specified xexpression. Users
18261859
* should not directly construct the slices but call helper functions

test/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "GNU")
102102
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
103103
endif()
104104
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_cxx_std_flag} -Wunused-parameter -Wextra -Wreorder -Wconversion -Wsign-conversion")
105-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast -Wunused-variable")
105+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wold-style-cast -Wunused-variable -ftemplate-backtrace-limit=0")
106106
if (XTENSOR_DISABLE_EXCEPTIONS)
107107
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
108108
endif()

test/test_xview.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#endif
2323

2424
#include "xtensor/xarray.hpp"
25+
#include "xtensor/xassign.hpp"
2526
#include "xtensor/xbuilder.hpp"
2627
#include "xtensor/xfixed.hpp"
2728
#include "xtensor/xmanipulation.hpp"
@@ -30,7 +31,6 @@
3031
#include "xtensor/xstrided_view.hpp"
3132
#include "xtensor/xtensor.hpp"
3233
#include "xtensor/xview.hpp"
33-
#include "xtensor/xassign.hpp"
3434

3535
namespace xt
3636
{
@@ -1695,12 +1695,13 @@ namespace xt
16951695
XT_ASSERT_THROW(const auto col = xt::col(arr, 0), std::invalid_argument);
16961696
}
16971697

1698-
TEST(xview, linearly_assign)
1698+
TEST(xview, reorder_function)
16991699
{
1700-
xtensor<float, 1> a = {1,2,3,4};
1701-
xtensor<float, 1> b = {5,6,7,8};
1700+
xtensor<float, 1> a = {1, 2, 3, 4};
1701+
xtensor<float, 1> b = {5, 6, 7, 8};
17021702
xtensor<float, 1> c = xtensor<float, 1>::from_shape(a);
1703-
auto v = xt::view(a + b, xt::all());
1703+
auto f = a + b;
1704+
auto v = xt::view(f, xt::all());
17041705
auto is_linear_assign = xt::xassign_traits<decltype(c), decltype(v)>::linear_assign(c, v, true);
17051706
EXPECT_TRUE(is_linear_assign);
17061707
}

0 commit comments

Comments
 (0)