Monero
Loading...
Searching...
No Matches
pair.h
Go to the documentation of this file.
1// Copyright (c) 2014-2022, The Monero Project
2//
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without modification, are
6// permitted provided that the following conditions are met:
7//
8// 1. Redistributions of source code must retain the above copyright notice, this list of
9// conditions and the following disclaimer.
10//
11// 2. Redistributions in binary form must reproduce the above copyright notice, this list
12// of conditions and the following disclaimer in the documentation and/or other
13// materials provided with the distribution.
14//
15// 3. Neither the name of the copyright holder nor the names of its contributors may be
16// used to endorse or promote products derived from this software without specific
17// prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
27// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28//
29// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
30
31#pragma once
32#include <memory>
33#include <boost/type_traits/make_unsigned.hpp>
34#include "serialization.h"
35
36namespace serialization
37{
38 namespace detail
39 {
40 template<typename T>
41 inline constexpr bool use_pair_varint() noexcept
42 {
43 return std::is_integral<T>::value && std::is_unsigned<T>::value && sizeof(T) > 1;
44 }
45
46 template <typename Archive, class T>
47 typename std::enable_if<!use_pair_varint<T>(), bool>::type
49 {
50 return do_serialize(ar, e);
51 }
52
53 template<typename Archive, typename T>
54 typename std::enable_if<use_pair_varint<T>(), bool>::type
56 {
57 static constexpr const bool previously_varint = std::is_same<uint64_t, T>();
58
59 if (!previously_varint && ar.varint_bug_backward_compatibility_enabled() && !typename Archive::is_saving())
60 return do_serialize(ar, e);
61 ar.serialize_varint(e);
62 return true;
63 }
64 }
65}
66
67template <template <bool> class Archive, class F, class S>
68inline bool do_serialize(Archive<false>& ar, std::pair<F,S>& p)
69{
70 size_t cnt;
71 ar.begin_array(cnt);
72 if (!ar.good())
73 return false;
74 if (cnt != 2)
75 return false;
76
78 return false;
79 if (!ar.good())
80 return false;
81 ar.delimit_array();
83 return false;
84 if (!ar.good())
85 return false;
86
87 ar.end_array();
88 return true;
89}
90
91template <template <bool> class Archive, class F, class S>
92inline bool do_serialize(Archive<true>& ar, std::pair<F,S>& p)
93{
94 ar.begin_array(2);
95 if (!ar.good())
96 return false;
98 return false;
99 if (!ar.good())
100 return false;
101 ar.delimit_array();
103 return false;
104 if (!ar.good())
105 return false;
106 ar.end_array();
107 return true;
108}
109
binary_archive< false > ar
Definition cold-outputs.cpp:54
bool do_serialize(Archive< false > &ar, std::vector< T > &v)
Definition containers.h:109
#define S(s)
Definition mdb_load.c:52
Definition container.h:34
constexpr bool use_pair_varint() noexcept
Definition pair.h:41
std::enable_if<!use_pair_varint< T >(), bool >::type serialize_pair_element(Archive &ar, T &e)
Definition pair.h:48
Definition binary_utils.h:36
bool do_serialize(Archive< false > &ar, std::pair< F, S > &p)
Definition pair.h:68
Simple DSL AAPI based on.
#define F(w, k)
Definition sha512-blocks.c:61
#define T(x)