Skip to content

Commit

Permalink
Merge pull request #144 from bernhardmgruber/refactor_coords
Browse files Browse the repository at this point in the history
Replace Index<I> by DatumCoord<I> and literal operator
  • Loading branch information
bernhardmgruber authored Jan 4, 2021
2 parents 0e33396 + 99f07bf commit 4f187f7
Show file tree
Hide file tree
Showing 8 changed files with 93 additions and 69 deletions.
6 changes: 1 addition & 5 deletions include/llama/Core.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,12 @@ namespace llama
template <typename Identifier, typename Type>
using DE = DatumElement<Identifier, Type>;

/// Tag describing an index. Used to access members of a \ref DatumArray.
template <std::size_t I>
using Index = boost::mp11::mp_size_t<I>;

namespace internal
{
template <typename ChildType, std::size_t... Is>
auto makeDatumArray(std::index_sequence<Is...>)
{
return DatumStruct<DatumElement<Index<Is>, ChildType>...>{};
return DatumStruct<DatumElement<DatumCoord<Is>, ChildType>...>{};
}
} // namespace internal

Expand Down
22 changes: 22 additions & 0 deletions include/llama/DatumCoord.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,28 @@ namespace llama
static constexpr std::size_t size = 0;
};

inline namespace literals
{
template <char... Digits>
constexpr auto operator"" _DC()
{
constexpr auto coord = []() constexpr
{
char digits[] = {(Digits - 48)...};
std::size_t acc = 0;
std ::size_t powerOf10 = 1;
for (int i = sizeof...(Digits) - 1; i >= 0; i--)
{
acc += digits[i] * powerOf10;
powerOf10 *= 10;
}
return acc;
}
();
return DatumCoord<coord>{};
}
} // namespace literals

namespace internal
{
template <class L>
Expand Down
3 changes: 2 additions & 1 deletion include/llama/DumpMapping.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ namespace llama
return structName(tag);
}

// handle array indices
template <std::size_t N>
auto tagToString(Index<N>)
auto tagToString(DatumCoord<N>)
{
return std::to_string(N);
}
Expand Down
3 changes: 2 additions & 1 deletion include/llama/mapping/tree/toString.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ namespace llama::mapping::tree
return "Unknown";
}

// handles array indices
template <std::size_t I>
inline auto toString(Index<I>) -> std::string
inline auto toString(DatumCoord<I>) -> std::string
{
return "";
}
Expand Down
64 changes: 31 additions & 33 deletions tests/core.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -87,29 +87,25 @@ TEST_CASE("prettyPrintType")
tag::Flags,
llama::DatumStruct<
llama::DatumElement<
std::integral_constant<
unsigned long,
llama::DatumCoord<
0
>,
bool
>,
llama::DatumElement<
std::integral_constant<
unsigned long,
llama::DatumCoord<
1
>,
bool
>,
llama::DatumElement<
std::integral_constant<
unsigned long,
llama::DatumCoord<
2
>,
bool
>,
llama::DatumElement<
std::integral_constant<
unsigned long,
llama::DatumCoord<
3
>,
bool
Expand Down Expand Up @@ -144,21 +140,22 @@ TEST_CASE("offsetOf")

TEST_CASE("GetCoordFromTags")
{
using namespace llama::literals;
// clang-format off
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle >, llama::DatumCoord< >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Pos >, llama::DatumCoord<0 >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Pos, tag::X >, llama::DatumCoord<0, 0>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Pos, tag::Y >, llama::DatumCoord<0, 1>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Pos, tag::Z >, llama::DatumCoord<0, 2>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Weight >, llama::DatumCoord<1 >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, llama::NoName >, llama::DatumCoord<2 >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Vel, tag::Z >, llama::DatumCoord<3, 0>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Vel, tag::X >, llama::DatumCoord<3, 1>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags >, llama::DatumCoord<4 >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags, llama::Index<0>>, llama::DatumCoord<4, 0>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags, llama::Index<1>>, llama::DatumCoord<4, 1>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags, llama::Index<2>>, llama::DatumCoord<4, 2>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags, llama::Index<3>>, llama::DatumCoord<4, 3>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle >, llama::DatumCoord< >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Pos >, llama::DatumCoord<0 >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Pos, tag::X >, llama::DatumCoord<0, 0>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Pos, tag::Y >, llama::DatumCoord<0, 1>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Pos, tag::Z >, llama::DatumCoord<0, 2>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Weight >, llama::DatumCoord<1 >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, llama::NoName >, llama::DatumCoord<2 >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Vel, tag::Z >, llama::DatumCoord<3, 0>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Vel, tag::X >, llama::DatumCoord<3, 1>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags >, llama::DatumCoord<4 >>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags, llama::DatumCoord<0>>, llama::DatumCoord<4, 0>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags, llama::DatumCoord<1>>, llama::DatumCoord<4, 1>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags, llama::DatumCoord<2>>, llama::DatumCoord<4, 2>>);
STATIC_REQUIRE(std::is_same_v<llama::GetCoordFromTags<Particle, tag::Flags, llama::DatumCoord<3>>, llama::DatumCoord<4, 3>>);
// clang-format on
}

Expand Down Expand Up @@ -273,16 +270,17 @@ using Arrays = llama::DS<

TEST_CASE("arrays")
{
auto v = llama::allocView(llama::mapping::AoS{llama::ArrayDomain{1}, Arrays{}});
using namespace llama::literals;

v(0u)(tag::A1{}, llama::Index<0>{});
v(0u)(tag::A1{}, llama::Index<1>{});
v(0u)(tag::A1{}, llama::Index<2>{});
v(0u)(tag::A2{}, llama::Index<0>{}, tag::X{});
v(0u)(tag::A2{}, llama::Index<1>{}, tag::X{});
v(0u)(tag::A2{}, llama::Index<2>{}, tag::X{});
v(0u)(tag::A3{}, llama::Index<0>{}, llama::Index<0>{});
v(0u)(tag::A3{}, llama::Index<0>{}, llama::Index<1>{});
v(0u)(tag::A3{}, llama::Index<1>{}, llama::Index<0>{});
v(0u)(tag::A3{}, llama::Index<1>{}, llama::Index<1>{});
auto v = llama::allocView(llama::mapping::AoS{llama::ArrayDomain{1}, Arrays{}});
v(0u)(tag::A1{}, 0_DC);
v(0u)(tag::A1{}, 1_DC);
v(0u)(tag::A1{}, 2_DC);
v(0u)(tag::A2{}, 0_DC, tag::X{});
v(0u)(tag::A2{}, 1_DC, tag::X{});
v(0u)(tag::A2{}, 2_DC, tag::X{});
v(0u)(tag::A3{}, 0_DC, 0_DC);
v(0u)(tag::A3{}, 0_DC, 1_DC);
v(0u)(tag::A3{}, 1_DC, 0_DC);
v(0u)(tag::A3{}, 1_DC, 1_DC);
}
9 changes: 9 additions & 0 deletions tests/datumcoord.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,12 @@ TEST_CASE("DatumCoordCommonPrefixIsBigger")
STATIC_REQUIRE(!llama::DatumCoordCommonPrefixIsBigger<llama::DatumCoord<0 >, llama::DatumCoord<0, 0, 1>>);
// clang-format on
}

TEST_CASE("_DT")
{
using namespace llama::literals;
STATIC_REQUIRE(std::is_same_v<llama::DatumCoord<0>, decltype(0_DC)>);
STATIC_REQUIRE(std::is_same_v<llama::DatumCoord<1>, decltype(1_DC)>);
STATIC_REQUIRE(std::is_same_v<llama::DatumCoord<10>, decltype(10_DC)>);
STATIC_REQUIRE(std::is_same_v<llama::DatumCoord<165463135>, decltype(165463135_DC)>);
}
24 changes: 8 additions & 16 deletions tests/treemap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -874,8 +874,7 @@ TEST_CASE("treemapping")
tag::Flags,
llama::Tuple<
llama::mapping::tree::Leaf<
std::integral_constant<
unsigned long,
llama::DatumCoord<
0
>,
bool,
Expand All @@ -885,8 +884,7 @@ TEST_CASE("treemapping")
>
>,
llama::mapping::tree::Leaf<
std::integral_constant<
unsigned long,
llama::DatumCoord<
1
>,
bool,
Expand All @@ -896,8 +894,7 @@ TEST_CASE("treemapping")
>
>,
llama::mapping::tree::Leaf<
std::integral_constant<
unsigned long,
llama::DatumCoord<
2
>,
bool,
Expand All @@ -907,8 +904,7 @@ TEST_CASE("treemapping")
>
>,
llama::mapping::tree::Leaf<
std::integral_constant<
unsigned long,
llama::DatumCoord<
3
>,
bool,
Expand Down Expand Up @@ -997,32 +993,28 @@ TEST_CASE("treemapping")
tag::Flags,
llama::Tuple<
llama::mapping::tree::Leaf<
std::integral_constant<
unsigned long,
llama::DatumCoord<
0
>,
bool,
unsigned long
>,
llama::mapping::tree::Leaf<
std::integral_constant<
unsigned long,
llama::DatumCoord<
1
>,
bool,
unsigned long
>,
llama::mapping::tree::Leaf<
std::integral_constant<
unsigned long,
llama::DatumCoord<
2
>,
bool,
unsigned long
>,
llama::mapping::tree::Leaf<
std::integral_constant<
unsigned long,
llama::DatumCoord<
3
>,
bool,
Expand Down
31 changes: 18 additions & 13 deletions tests/view.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,18 @@ TEST_CASE("view.access")
CHECK(&x == &view(pos)(tag::Pos{}, tag::X{}));

// also test arrays
using namespace llama::literals;
const bool& o0 = view(pos)(tag::Flags{})(llama::DatumCoord<0>{});
CHECK(&o0 == &view(pos)(tag::Flags{})(llama::Index<0>{}));
CHECK(&o0 == &view(pos)(tag::Flags{})(0_DC));
};
l(view);
l(std::as_const(view));
}

TEST_CASE("view.assign-one-datum")
{
using namespace llama::literals;

using ArrayDomain = llama::ArrayDomain<2>;
ArrayDomain arrayDomain{16, 16};

Expand All @@ -188,10 +191,10 @@ TEST_CASE("view.assign-one-datum")
datum(tag::Pos{}, tag::Z{}) = 16.0f;
datum(tag::Momentum{}) = 0;
datum(tag::Weight{}) = 500.0f;
datum(tag::Flags{})(llama::Index<0>{}) = true;
datum(tag::Flags{})(llama::Index<1>{}) = false;
datum(tag::Flags{})(llama::Index<2>{}) = true;
datum(tag::Flags{})(llama::Index<3>{}) = false;
datum(tag::Flags{})(0_DC) = true;
datum(tag::Flags{})(1_DC) = false;
datum(tag::Flags{})(2_DC) = true;
datum(tag::Flags{})(3_DC) = false;

view({3, 4}) = datum;

Expand All @@ -202,14 +205,16 @@ TEST_CASE("view.assign-one-datum")
CHECK(datum(tag::Momentum{}, tag::Y{}) == 0);
CHECK(datum(tag::Momentum{}, tag::Z{}) == 0);
CHECK(datum(tag::Weight{}) == 500.0f);
CHECK(datum(tag::Flags{})(llama::Index<0>{}) == true);
CHECK(datum(tag::Flags{})(llama::Index<1>{}) == false);
CHECK(datum(tag::Flags{})(llama::Index<2>{}) == true);
CHECK(datum(tag::Flags{})(llama::Index<3>{}) == false);
CHECK(datum(tag::Flags{})(0_DC) == true);
CHECK(datum(tag::Flags{})(1_DC) == false);
CHECK(datum(tag::Flags{})(2_DC) == true);
CHECK(datum(tag::Flags{})(3_DC) == false);
}

TEST_CASE("view.addresses")
{
using namespace llama::literals;

using ArrayDomain = llama::ArrayDomain<2>;
ArrayDomain arrayDomain{16, 16};

Expand All @@ -225,10 +230,10 @@ TEST_CASE("view.addresses")
auto& mx = view(pos)(tag::Momentum{}, tag::X{});
auto& my = view(pos)(tag::Momentum{}, tag::Y{});
auto& mz = view(pos)(tag::Momentum{}, tag::Z{});
auto& o0 = view(pos)(tag::Flags{})(llama::Index<0>{});
auto& o1 = view(pos)(tag::Flags{})(llama::Index<1>{});
auto& o2 = view(pos)(tag::Flags{})(llama::Index<2>{});
auto& o3 = view(pos)(tag::Flags{})(llama::Index<3>{});
auto& o0 = view(pos)(tag::Flags{})(0_DC);
auto& o1 = view(pos)(tag::Flags{})(1_DC);
auto& o2 = view(pos)(tag::Flags{})(2_DC);
auto& o3 = view(pos)(tag::Flags{})(3_DC);

CHECK((size_t) &y - (size_t) &x == 2048);
CHECK((size_t) &z - (size_t) &x == 4096);
Expand Down

0 comments on commit 4f187f7

Please sign in to comment.