Skip to content

Commit

Permalink
[ENH] Add LevelProperty public attribute to all the levels (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
adam2392 committed Jun 6, 2023
1 parent 80a4e4b commit 9f47a2c
Show file tree
Hide file tree
Showing 12 changed files with 145 additions and 65 deletions.
21 changes: 11 additions & 10 deletions include/xsparse/levels/compressed.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,25 @@ namespace xsparse
class PK,
class ContainerTraits
= util::container_traits<std::vector, std::unordered_set, std::unordered_map>,
class LevelProperties = level_properties<true, true, true, false, true>>
class _LevelProperties = level_properties<true, true, true, false, true>>
class compressed;

template <class... LowerLevels,
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class compressed<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>
class _LevelProperties>
class compressed<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>
: public level_capabilities::coordinate_position_iterate<compressed,
std::tuple<LowerLevels...>,
IK,
PK,
ContainerTraits,
LevelProperties>
_LevelProperties>

{
static_assert(!LevelProperties::is_branchless);
static_assert(LevelProperties::is_compact);
static_assert(!_LevelProperties::is_branchless);
static_assert(_LevelProperties::is_compact);
using PosContainer = typename ContainerTraits::template Vec<PK>;
using CrdContainer = typename ContainerTraits::template Vec<IK>;

Expand All @@ -48,14 +48,15 @@ namespace xsparse
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelCapabilities
= level_capabilities::coordinate_position_iterate<compressed,
std::tuple<LowerLevels...>,
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelProperties = _LevelProperties;

public:
compressed(IK size)
Expand Down Expand Up @@ -132,9 +133,9 @@ namespace xsparse
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class _LevelProperties>
struct util::coordinate_position_trait<
levels::compressed<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>>
levels::compressed<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>>
{
using Coordinate = IK;
using Position = PK;
Expand Down
24 changes: 13 additions & 11 deletions include/xsparse/levels/dense.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,31 +13,33 @@ namespace xsparse
template <class LowerLevels,
class IK,
class PK,
class LevelProperties = level_properties<true, true, true, false, true>>
class _LevelProperties = level_properties<true, true, true, false, true>>
class dense;

template <class... LowerLevels, class IK, class PK, class LevelProperties>
class dense<std::tuple<LowerLevels...>, IK, PK, LevelProperties>
template <class... LowerLevels, class IK, class PK, class _LevelProperties>
class dense<std::tuple<LowerLevels...>, IK, PK, _LevelProperties>
: public level_capabilities::coordinate_value_iterate<dense,
std::tuple<LowerLevels...>,
IK,
PK,
LevelProperties>
_LevelProperties>

{
static_assert(LevelProperties::is_full);
static_assert(!LevelProperties::is_branchless);
static_assert(LevelProperties::is_compact);
static_assert(_LevelProperties::is_full);
static_assert(!_LevelProperties::is_branchless);
static_assert(_LevelProperties::is_compact);
static_assert(_LevelProperties::is_ordered);

public:
using LevelCapabilities
= level_capabilities::coordinate_value_iterate<dense,
std::tuple<LowerLevels...>,
IK,
PK,
LevelProperties>;
_LevelProperties>;
using BaseTraits
= util::base_traits<dense, std::tuple<LowerLevels...>, IK, PK, LevelProperties>;
= util::base_traits<dense, std::tuple<LowerLevels...>, IK, PK, _LevelProperties>;
using LevelProperties = _LevelProperties;

public:
dense(IK size)
Expand Down Expand Up @@ -73,9 +75,9 @@ namespace xsparse
};
}

template <class... LowerLevels, class IK, class PK, class LevelProperties>
template <class... LowerLevels, class IK, class PK, class _LevelProperties>
struct util::coordinate_position_trait<
levels::dense<std::tuple<LowerLevels...>, IK, PK, LevelProperties>>
levels::dense<std::tuple<LowerLevels...>, IK, PK, _LevelProperties>>
{
using Coordinate = IK;
using Position = PK;
Expand Down
19 changes: 10 additions & 9 deletions include/xsparse/levels/hashed.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,19 @@ namespace xsparse
class PK,
class ContainerTraits
= util::container_traits<std::vector, std::unordered_set, std::unordered_map>,
class LevelProperties = level_properties<true, false, true, false, false>>
class _LevelProperties = level_properties<true, false, true, false, false>>
class hashed;

template <class... LowerLevels,
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class hashed<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>
class _LevelProperties>
class hashed<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>
{
static_assert(!LevelProperties::is_ordered);
static_assert(!LevelProperties::is_branchless);
static_assert(!LevelProperties::is_compact);
static_assert(!_LevelProperties::is_ordered);
static_assert(!_LevelProperties::is_branchless);
static_assert(!_LevelProperties::is_compact);
using CrdContainer = typename ContainerTraits::template Vec<
typename ContainerTraits::template Map<IK, PK>>;

Expand All @@ -44,7 +44,8 @@ namespace xsparse
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelProperties = _LevelProperties;

public:
class iteration_helper
Expand Down Expand Up @@ -180,9 +181,9 @@ namespace xsparse
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class _LevelProperties>
struct util::coordinate_position_trait<
levels::hashed<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>>
levels::hashed<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>>
{
using Coordinate = IK;
using Position = PK;
Expand Down
23 changes: 12 additions & 11 deletions include/xsparse/levels/offset.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,26 @@ namespace xsparse
class PK,
class ContainerTraits
= util::container_traits<std::vector, std::unordered_set, std::unordered_map>,
class LevelProperties = level_properties<false, true, true, true, false>>
class _LevelProperties = level_properties<false, true, true, true, false>>
class offset;

template <class... LowerLevels,
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class offset<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>
class _LevelProperties>
class offset<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>
: public level_capabilities::coordinate_position_iterate<offset,
std::tuple<LowerLevels...>,
IK,
PK,
ContainerTraits,
LevelProperties>
_LevelProperties>

{
static_assert(!LevelProperties::is_full);
static_assert(LevelProperties::is_branchless);
static_assert(!LevelProperties::is_compact);
static_assert(!_LevelProperties::is_full);
static_assert(_LevelProperties::is_branchless);
static_assert(!_LevelProperties::is_compact);
using OffsetContainer = typename ContainerTraits::template Vec<PK>;

public:
Expand All @@ -46,14 +46,15 @@ namespace xsparse
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelCapabilities
= level_capabilities::coordinate_position_iterate<offset,
std::tuple<LowerLevels...>,
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelProperties = _LevelProperties;

public:
offset(IK size)
Expand Down Expand Up @@ -101,9 +102,9 @@ namespace xsparse
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class _LevelProperties>
struct util::coordinate_position_trait<
levels::offset<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>>
levels::offset<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>>
{
using Coordinate = IK;
using Position = PK;
Expand Down
23 changes: 12 additions & 11 deletions include/xsparse/levels/range.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,25 @@ namespace xsparse
class PK,
class ContainerTraits
= util::container_traits<std::vector, std::unordered_set, std::unordered_map>,
class LevelProperties = level_properties<false, true, true, false, false>>
class _LevelProperties = level_properties<false, true, true, false, false>>
class range;

template <class... LowerLevels,
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class range<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>
class _LevelProperties>
class range<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>
: public level_capabilities::coordinate_value_iterate<range,
std::tuple<LowerLevels...>,
IK,
PK,
ContainerTraits,
LevelProperties>
_LevelProperties>
{
static_assert(!LevelProperties::is_full);
static_assert(!LevelProperties::is_branchless);
static_assert(!LevelProperties::is_compact);
static_assert(!_LevelProperties::is_full);
static_assert(!_LevelProperties::is_branchless);
static_assert(!_LevelProperties::is_compact);
using OffsetContainer = typename ContainerTraits::template Vec<PK>;

public:
Expand All @@ -45,14 +45,15 @@ namespace xsparse
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelCapabilities
= level_capabilities::coordinate_value_iterate<range,
std::tuple<LowerLevels...>,
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelProperties = _LevelProperties;

public:
range(IK size_N, IK size_M)
Expand Down Expand Up @@ -101,9 +102,9 @@ namespace xsparse
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class _LevelProperties>
struct util::coordinate_position_trait<
levels::range<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>>
levels::range<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>>
{
using Coordinate = IK;
using Position = PK;
Expand Down
21 changes: 11 additions & 10 deletions include/xsparse/levels/singleton.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,25 @@ namespace xsparse
class PK,
class ContainerTraits
= util::container_traits<std::vector, std::unordered_set, std::unordered_map>,
class LevelProperties = level_properties<true, true, true, true, true>>
class _LevelProperties = level_properties<true, true, true, true, true>>
class singleton;

template <class... LowerLevels,
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class singleton<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>
class _LevelProperties>
class singleton<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>
: public level_capabilities::coordinate_position_iterate<singleton,
std::tuple<LowerLevels...>,
IK,
PK,
ContainerTraits,
LevelProperties>
_LevelProperties>

{
static_assert(LevelProperties::is_branchless);
static_assert(LevelProperties::is_compact);
static_assert(_LevelProperties::is_branchless);
static_assert(_LevelProperties::is_compact);
using CrdContainer = typename ContainerTraits::template Vec<PK>;

public:
Expand All @@ -47,14 +47,15 @@ namespace xsparse
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelCapabilities
= level_capabilities::coordinate_position_iterate<singleton,
std::tuple<LowerLevels...>,
IK,
PK,
ContainerTraits,
LevelProperties>;
_LevelProperties>;
using LevelProperties = _LevelProperties;

public:
singleton(IK size)
Expand Down Expand Up @@ -107,9 +108,9 @@ namespace xsparse
class IK,
class PK,
class ContainerTraits,
class LevelProperties>
class _LevelProperties>
struct util::coordinate_position_trait<
levels::singleton<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, LevelProperties>>
levels::singleton<std::tuple<LowerLevels...>, IK, PK, ContainerTraits, _LevelProperties>>
{
using Coordinate = IK;
using Position = PK;
Expand Down
2 changes: 1 addition & 1 deletion test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ include(../cmake/tools.cmake)

include(../cmake/CPM.cmake)

CPMAddPackage("gh:doctest/doctest@2.4.9")
CPMAddPackage("gh:doctest/doctest#v2.4.11")
CPMAddPackage("gh:TheLartians/Format.cmake@1.7.3")

if(TEST_INSTALLED_VERSION)
Expand Down
4 changes: 4 additions & 0 deletions test/source/compressed_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@ TEST_CASE("Compressed-BaseCase")
++l;
}
CHECK(l == pos.back());

// Check basic strict properties of all compressed levels
CHECK(!decltype(s)::LevelProperties::is_branchless);
CHECK(decltype(s)::LevelProperties::is_compact);
}

TEST_CASE("Compressed-CSR")
Expand Down

0 comments on commit 9f47a2c

Please sign in to comment.