| 58 | } |
| 59 | |
| 60 | class MapVisitor |
| 61 | { |
| 62 | public: |
| 63 | explicit MapVisitor(uint8_t const * base) : m_base(base), m_cur(m_base) {} |
| 64 | |
| 65 | template <typename T> |
| 66 | std::enable_if_t<!std::is_trivial_v<T>, MapVisitor &> operator()(T & val, char const * /* name */) |
| 67 | { |
| 68 | val.map(*this); |
| 69 | return *this; |
| 70 | } |
| 71 | |
| 72 | template <typename T> |
| 73 | std::enable_if_t<std::is_trivial_v<T>, MapVisitor &> operator()(T & val, char const * /* name */) |
| 74 | { |
| 75 | T const * valPtr = reinterpret_cast<T const *>(m_cur); |
| 76 | val = *valPtr; |
| 77 | |
| 78 | m_cur = Align8Ptr(m_cur + sizeof(T)); |
| 79 | return *this; |
| 80 | } |
| 81 | |
| 82 | template <typename T> |
| 83 | MapVisitor & operator()(succinct::mapper::mappable_vector<T> & vec, char const * /* name */) |
| 84 | { |
| 85 | vec.clear(); |
| 86 | (*this)(vec.m_size, "size"); |
| 87 | vec.m_data = reinterpret_cast<T const *>(m_cur); |
| 88 | |
| 89 | m_cur = Align8Ptr(m_cur + vec.m_size * sizeof(T)); |
| 90 | return *this; |
| 91 | } |
| 92 | |
| 93 | uint64_t BytesRead() const { return static_cast<uint64_t>(m_cur - m_base); } |
| 94 | |
| 95 | private: |
| 96 | uint8_t const * const m_base; |
| 97 | uint8_t const * m_cur; |
| 98 | |
| 99 | DISALLOW_COPY_AND_MOVE(MapVisitor); |
| 100 | }; |
| 101 | |
| 102 | class ReverseMapVisitor |
| 103 | { |