Skip to content

Commit

Permalink
feat: Improve index of compile time (#165)
Browse files Browse the repository at this point in the history
  • Loading branch information
erikzenker authored Jul 4, 2021
1 parent d673f66 commit 882422d
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 10 deletions.
107 changes: 104 additions & 3 deletions benchmark/components/index_of_benchmark.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,111 @@
#include <iostream>

#include "ComplexStateMachine.h"
#include "hsm/details/index_map.h"

using namespace hsm;

namespace {
class s1 {
};
class s2 {
};
class s3 {
};
class s4 {
};
class s5 {
};
class s6 {
};
class s7 {
};
class s8 {
};
class s9 {
};
class s10 {
};
class s11 {
};
class s12 {
};
class s13 {
};
class s14 {
};
class s15 {
};
class s16 {
};
class s17 {
};
class s18 {
};
class s19 {
};
class s20 {
};
class s21 {
};
class s22 {
};
class s23 {
};
class s24 {
};
class s25 {
};
class s26 {
};
class s27 {
};
class s28 {
};
class s29 {
};
class s30 {
};
class s31 {
};
class s32 {
};
class s33 {
};
class s34 {
};
class s35 {
};
class s36 {
};
class s37 {
};
class s38 {
};
class s39 {
};
class s40 {
};
class s41 {
};
class s42 {
};
class s43 {
};
class s44 {
};
class s45 {
};
class s46 {
};
class s47 {
};
class s48 {
};
class s49 {
};
class s50 {
};

}

int main()
{
using namespace boost::hana;
Expand Down
2 changes: 2 additions & 0 deletions include/hsm/details/fill_dispatch_table.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ constexpr auto addDispatchTableEntry(
[=](auto& dispatchTable, auto&& transition2, bool internal) -> void {
const auto defer = false;
const auto valid = true;

// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
dispatchTable[fromIdx].push_front(
{ toIdx, history, defer, valid, internal, std::move(transition2) });
},
Expand Down
34 changes: 27 additions & 7 deletions include/hsm/details/index_map.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,41 @@
#include <boost/hana/basic_tuple.hpp>
#include <boost/hana/zip.hpp>

//#include <boost/mp11.hpp>
namespace {
template <class X, class Tuple> class GetIdx;

template <class X, class... T> class GetIdx<X, boost::hana::tuple<T...>> {
template <std::size_t... idx>
static constexpr auto find_idx(std::index_sequence<idx...> seq) -> std::size_t
{
return seq.size() + ((std::is_same<X, T>::value ? idx - seq.size() : 0) + ...);
}

public:
static constexpr std::size_t value = find_idx(std::index_sequence_for<T...> {});
};

template <class X, class... T> class GetIdx<X, boost::hana::basic_tuple<T...>> {
template <std::size_t... idx>
static constexpr auto find_idx(std::index_sequence<idx...> seq) -> std::size_t
{
return seq.size() + ((std::is_same<X, T>::value ? idx - seq.size() : 0) + ...);
}

public:
static constexpr std::size_t value = find_idx(std::index_sequence_for<T...> {});
};
}

namespace hsm {

namespace bh {
using namespace boost::hana;
}

template <class Iterable, class Element>
constexpr auto index_of(Iterable const& iterable, Element const& element)
template <class Iterable, class Element> constexpr auto index_of(Iterable const&, Element const&)
{
return bh::apply(
[](auto size, auto dropped) { return size - dropped; },
bh::size(iterable),
bh::size(bh::drop_while(iterable, bh::not_equal.to(element))));
return GetIdx<Element, Iterable>::value;
}

template <class Typeids> constexpr auto make_index_map(Typeids typeids)
Expand Down
2 changes: 2 additions & 0 deletions test/unit/stateidx_tests.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include "hsm/details/fill_dispatch_table.h"
#include "hsm/details/index_map.h"
#include "hsm/details/state.h"
#include "hsm/details/transition_table.h"

#include "hsm/front/transition_tuple.h"

#include <gtest/gtest.h>
Expand Down

0 comments on commit 882422d

Please sign in to comment.