mirror of
https://github.com/fraillt/bitsery.git
synced 2026-06-08 08:13:56 +00:00
std::atomic support (#54)
This commit is contained in:
35
include/bitsery/brief_syntax/atomic.h
Normal file
35
include/bitsery/brief_syntax/atomic.h
Normal file
@@ -0,0 +1,35 @@
|
||||
//MIT License
|
||||
//
|
||||
//Copyright (c) 2020 Nick Renieris
|
||||
//
|
||||
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
//of this software and associated documentation files (the "Software"), to deal
|
||||
//in the Software without restriction, including without limitation the rights
|
||||
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
//copies of the Software, and to permit persons to whom the Software is
|
||||
//furnished to do so, subject to the following conditions:
|
||||
//
|
||||
//The above copyright notice and this permission notice shall be included in all
|
||||
//copies or substantial portions of the Software.
|
||||
//
|
||||
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
//SOFTWARE.
|
||||
|
||||
#ifndef BITSERY_BRIEF_SYNTAX_TYPE_STD_ATOMIC_H
|
||||
#define BITSERY_BRIEF_SYNTAX_TYPE_STD_ATOMIC_H
|
||||
|
||||
#include "../ext/std_atomic.h"
|
||||
|
||||
namespace bitsery {
|
||||
template<typename S, typename T>
|
||||
void serialize(S &s, std::atomic<T> &obj) {
|
||||
s.template ext<sizeof(T)>(obj, ext::StdAtomic{});
|
||||
}
|
||||
}
|
||||
|
||||
#endif //BITSERY_BRIEF_SYNTAX_TYPE_STD_ATOMIC_H
|
||||
65
include/bitsery/ext/std_atomic.h
Normal file
65
include/bitsery/ext/std_atomic.h
Normal file
@@ -0,0 +1,65 @@
|
||||
//MIT License
|
||||
//
|
||||
//Copyright (c) 2020 Nick Renieris
|
||||
//
|
||||
//Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
//of this software and associated documentation files (the "Software"), to deal
|
||||
//in the Software without restriction, including without limitation the rights
|
||||
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
//copies of the Software, and to permit persons to whom the Software is
|
||||
//furnished to do so, subject to the following conditions:
|
||||
//
|
||||
//The above copyright notice and this permission notice shall be included in all
|
||||
//copies or substantial portions of the Software.
|
||||
//
|
||||
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
//SOFTWARE.
|
||||
|
||||
#ifndef BITSERY_EXT_STD_ATOMIC_H
|
||||
#define BITSERY_EXT_STD_ATOMIC_H
|
||||
|
||||
#include "../traits/core/traits.h"
|
||||
#include <atomic>
|
||||
|
||||
namespace bitsery {
|
||||
namespace ext {
|
||||
|
||||
class StdAtomic {
|
||||
public:
|
||||
|
||||
template<typename Ser, typename T, typename Fnc>
|
||||
void serialize(Ser& ser, const std::atomic<T>& obj, Fnc&& fnc) const {
|
||||
auto res = obj.load();
|
||||
fnc(ser, res);
|
||||
}
|
||||
|
||||
template<typename Des, typename T, typename Fnc>
|
||||
void deserialize(Des& des, std::atomic<T>& obj, Fnc&& fnc) const {
|
||||
T res{};
|
||||
fnc(des, res);
|
||||
obj.store(res);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace traits {
|
||||
template<typename T>
|
||||
struct ExtensionTraits<ext::StdAtomic, std::atomic<T>> {
|
||||
using TValue = T;
|
||||
static constexpr bool SupportValueOverload = true;
|
||||
static constexpr bool SupportObjectOverload = false;
|
||||
static constexpr bool SupportLambdaOverload = false;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif //BITSERY_EXT_STD_ATOMIC_H
|
||||
@@ -22,6 +22,7 @@
|
||||
|
||||
#include <bitsery/brief_syntax.h>
|
||||
#include <bitsery/brief_syntax/array.h>
|
||||
#include <bitsery/brief_syntax/atomic.h>
|
||||
#include <bitsery/brief_syntax/chrono.h>
|
||||
#include <bitsery/brief_syntax/deque.h>
|
||||
#include <bitsery/brief_syntax/forward_list.h>
|
||||
@@ -49,6 +50,9 @@
|
||||
#include <gmock/gmock.h>
|
||||
#include "serialization_test_utils.h"
|
||||
|
||||
#include <atomic>
|
||||
#include <utility>
|
||||
|
||||
using testing::Eq;
|
||||
|
||||
TEST(BriefSyntax, FundamentalTypesAndBool) {
|
||||
@@ -151,6 +155,15 @@ T procBriefSyntax(const T& testData) {
|
||||
return res;
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T&& procBriefSyntaxRvalue(const T& testData) {
|
||||
SerializationContext ctx;
|
||||
ctx.createSerializer()(testData);
|
||||
T res{};
|
||||
ctx.createDeserializer()(res);
|
||||
return std::move(res);
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T procBriefSyntaxWithMaxSize(const T& testData) {
|
||||
SerializationContext ctx;
|
||||
@@ -411,6 +424,21 @@ TEST(BriefSyntax, StdTimePoint) {
|
||||
EXPECT_TRUE(procBriefSyntax(data) == data);
|
||||
}
|
||||
|
||||
TEST(BriefSyntax, StdAtomic) {
|
||||
std::atomic<int32_t> atm0{54654};
|
||||
EXPECT_TRUE(procBriefSyntaxRvalue(atm0) == atm0);
|
||||
|
||||
std::atomic<bool> atm1{false};
|
||||
EXPECT_TRUE(procBriefSyntaxRvalue(atm1) == atm1);
|
||||
|
||||
std::atomic<bool> atm2{true};
|
||||
EXPECT_TRUE(procBriefSyntaxRvalue(atm2) == atm2);
|
||||
|
||||
std::atomic<uint16_t> atm3;
|
||||
atm3.store(0x1337);
|
||||
EXPECT_TRUE(procBriefSyntaxRvalue(atm3).load() == 0x1337);
|
||||
}
|
||||
|
||||
#if __cplusplus > 201402L
|
||||
|
||||
TEST(BriefSyntax, StdTuple) {
|
||||
|
||||
Reference in New Issue
Block a user