1 #ifndef FULL_NODE_VIEW_HPP
2 #define FULL_NODE_VIEW_HPP
4 #include "wordsearch_solver/compact_trie2/compact_trie2_iterator_typedefs.hpp"
5 #include "wordsearch_solver/compact_trie2/mini_offsets.hpp"
7 #include <fmt/format.h>
8 #include <range/v3/iterator/access.hpp>
9 #include <range/v3/view/subrange.hpp>
10 #include <range/v3/view/transform.hpp>
17 #include <type_traits>
30 auto base()
const {
return it_; }
37 bool is_only_end_of_word()
const {
54 return *(it_ + 3) & 0x80;
59 assert(!this->is_only_end_of_word());
60 std::uint_fast32_t n{};
61 std::memcpy(&n, &*(it_ + 1), 3);
72 const auto offset = it_ + 4;
73 return ranges::subrange(offset, offset + this->
data_size());
79 assert(!this->is_only_end_of_word());
80 const auto offset = it_ + 4 + this->
data_size();
82 return make_mini_offsets(
83 ranges::subrange(offset, offset + 2 * (this->
data_size() - 1)));
89 template <
class = std::enable_if_t<std::is_convertible_v<
90 std::add_pointer_t<ranges::iter_value_t<Iterator>>,
void*>>>
98 const auto n = bits.to_ulong();
101 std::memcpy(&*it, &n, 3);
117 friend std::ostream& operator<<(std::ostream& os,
const FullNodeView_& nv) {
118 auto to_uint = ranges::views::transform(
119 [](
const auto val) {
return static_cast<std::size_t
>(val); });
120 auto to_char = ranges::views::transform(
121 [](
const auto val) {
return static_cast<char>(val); });
126 const auto data = nv.
data() | to_char;
135 return os << fmt::format(
"FullNode: {{Size: {}, EndOfWord: {}, "
136 "next_row_offset: {}, data: {}, mini_offsets {}}}",
144 using FullNodeViewMut = FullNodeView_<DataIteratorMut>;
145 using FullNodeView = FullNodeView_<DataIterator>;
Class representing a full node, a view into a contiguous array.
Definition: full_node_view.hpp:25
std::uint_fast32_t next_row_offset() const
Definition: full_node_view.hpp:58
auto base() const
Definition: full_node_view.hpp:30
void set_next_row_offset(const std::uint_fast32_t next_row_offset)
Set the 23 bit next_row_offset from a 4byte unsigned int.
Definition: full_node_view.hpp:91
auto mini_offsets() const
Definition: full_node_view.hpp:78
bool is_end_of_word() const
Definition: full_node_view.hpp:46
std::uint8_t data_size() const
Number of letters stored in this node.
Definition: full_node_view.hpp:43
std::size_t size() const
Definition: full_node_view.hpp:33
auto data() const
Definition: full_node_view.hpp:71
namespace compact_trie2
Definition: compact_trie2.hpp:19