From: Sangwan Kwon Date: Mon, 18 Nov 2019 10:50:09 +0000 (+0900) Subject: Support conversion between archive and string X-Git-Tag: submit/tizen/20200810.073515~157 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3c4eec1c682645ab14d805f9dbabcaf4a517e5b1;p=platform%2Fcore%2Fsecurity%2Fvist.git Support conversion between archive and string Signed-off-by: Sangwan Kwon --- diff --git a/src/vist/archive.hpp b/src/vist/archive.hpp index f1d525a..4086652 100644 --- a/src/vist/archive.hpp +++ b/src/vist/archive.hpp @@ -44,6 +44,12 @@ using IsArchival = typename std::enable_if::value, class Archive final { public: + explicit Archive() = default; + /// Use only when flatten data comes from Archive (by casting to string) + explicit Archive(const std::string& flatten) : buffer(flatten.cbegin(), flatten.cend()) + { + } + template void pack(const Front& front, const Rest&... rest); inline void pack(void) {} @@ -55,7 +61,7 @@ public: template void transform(std::tuple& tuple); - // serialize method + /// serialize method template = 0> Archive& operator<<(const T& value); template = 0> @@ -67,7 +73,7 @@ public: Archive& operator<<(const std::string& value); Archive& operator<<(const Archive& archive); - // deserialize method + /// deserialize method template = 0> Archive& operator>>(T& value); template = 0> @@ -83,9 +89,15 @@ public: std::size_t size(void) const noexcept; void reserve(std::size_t size) noexcept; + /// It is not safe when Archive includes binary formats. + operator std::string() const + { + return std::string(this->buffer.begin(), this->buffer.end()); + } + protected: - virtual void save(const void* bytes, std::size_t size); - virtual void load(void* bytes, std::size_t size); + void save(const void* bytes, std::size_t size); + void load(void* bytes, std::size_t size); private: template diff --git a/src/vist/common/tests/archive.cpp b/src/vist/common/tests/archive.cpp index ab8c69b..508eb83 100644 --- a/src/vist/common/tests/archive.cpp +++ b/src/vist/common/tests/archive.cpp @@ -310,3 +310,21 @@ TEST(ArchiveTests, parameter_pack_transform_empty) Archive archive; archive.transform(tuple); } + +TEST(ArchiveTests, string_conversion) +{ + int input1 = std::numeric_limits::lowest(); + int input2 = std::numeric_limits::max(); + + Archive archive; + archive << input1 << input2; + + std::string flatten = archive; + Archive restore(flatten); + + int output1, output2; + restore >> output1 >> output2; + + EXPECT_EQ(input1, output1); + EXPECT_EQ(input2, output2); +}