diff --git a/nano/store/CMakeLists.txt b/nano/store/CMakeLists.txt index a992ba59..bf79b03e 100644 --- a/nano/store/CMakeLists.txt +++ b/nano/store/CMakeLists.txt @@ -5,6 +5,7 @@ add_library( component.hpp confirmation_height.hpp db_val.hpp + db_val_impl.hpp iterator.hpp iterator_impl.hpp final.hpp diff --git a/nano/store/db_val.hpp b/nano/store/db_val.hpp index 957492e2..a9fc4cc8 100644 --- a/nano/store/db_val.hpp +++ b/nano/store/db_val.hpp @@ -9,6 +9,11 @@ #include +namespace nano +{ +class block; +} + namespace nano::store { /** @@ -92,15 +97,7 @@ public: static_assert (std::is_standard_layout::value, "Standard layout is required"); } - db_val (std::shared_ptr const & val_a) : - buffer (std::make_shared> ()) - { - { - nano::vectorstream stream (*buffer); - nano::serialize_block (stream, *val_a); - } - convert_buffer_to_value (); - } + db_val (std::shared_ptr const & val_a); db_val (uint64_t val_a) : buffer (std::make_shared> ()) @@ -209,16 +206,7 @@ public: return result; } - explicit operator block_w_sideband () const - { - nano::bufferstream stream (reinterpret_cast (data ()), size ()); - nano::store::block_w_sideband block_w_sideband; - block_w_sideband.block = (nano::deserialize_block (stream)); - auto error = block_w_sideband.sideband.deserialize (stream, block_w_sideband.block->type ()); - release_assert (!error); - block_w_sideband.block->sideband_set (block_w_sideband.sideband); - return block_w_sideband; - } + explicit operator block_w_sideband () const; explicit operator std::nullptr_t () const { @@ -230,12 +218,7 @@ public: return no_value::dummy; } - explicit operator std::shared_ptr () const - { - nano::bufferstream stream (reinterpret_cast (data ()), size ()); - std::shared_ptr result (nano::deserialize_block (stream)); - return result; - } + explicit operator std::shared_ptr () const; template std::shared_ptr convert_to_block () const diff --git a/nano/store/db_val_impl.hpp b/nano/store/db_val_impl.hpp new file mode 100644 index 00000000..a8de6f00 --- /dev/null +++ b/nano/store/db_val_impl.hpp @@ -0,0 +1,33 @@ +#include +#include + +template +nano::store::db_val::db_val (std::shared_ptr const & val_a) : + buffer (std::make_shared> ()) +{ + { + nano::vectorstream stream (*buffer); + nano::serialize_block (stream, *val_a); + } + convert_buffer_to_value (); +} + +template +nano::store::db_val::operator std::shared_ptr () const +{ + nano::bufferstream stream (reinterpret_cast (data ()), size ()); + std::shared_ptr result (nano::deserialize_block (stream)); + return result; +} + +template +nano::store::db_val::operator nano::store::block_w_sideband () const +{ + nano::bufferstream stream (reinterpret_cast (data ()), size ()); + nano::store::block_w_sideband block_w_sideband; + block_w_sideband.block = (nano::deserialize_block (stream)); + auto error = block_w_sideband.sideband.deserialize (stream, block_w_sideband.block->type ()); + release_assert (!error); + block_w_sideband.block->sideband_set (block_w_sideband.sideband); + return block_w_sideband; +} diff --git a/nano/store/lmdb/block.cpp b/nano/store/lmdb/block.cpp index ff6113f0..38e695ba 100644 --- a/nano/store/lmdb/block.cpp +++ b/nano/store/lmdb/block.cpp @@ -1,4 +1,5 @@ #include +#include #include #include diff --git a/nano/store/rocksdb/block.cpp b/nano/store/rocksdb/block.cpp index 2fe5365e..a910e0cc 100644 --- a/nano/store/rocksdb/block.cpp +++ b/nano/store/rocksdb/block.cpp @@ -1,4 +1,5 @@ #include +#include #include #include