Line data Source code
1 : /*! \file optional.hpp
2 : \brief Support for std::optional
3 : \ingroup STLSupport */
4 : /*
5 : Copyright (c) 2017, Juan Pedro Bolivar Puente
6 : All rights reserved.
7 :
8 : Redistribution and use in source and binary forms, with or without
9 : modification, are permitted provided that the following conditions are met:
10 : * Redistributions of source code must retain the above copyright
11 : notice, this list of conditions and the following disclaimer.
12 : * Redistributions in binary form must reproduce the above copyright
13 : notice, this list of conditions and the following disclaimer in the
14 : documentation and/or other materials provided with the distribution.
15 : * Neither the name of cereal nor the
16 : names of its contributors may be used to endorse or promote products
17 : derived from this software without specific prior written permission.
18 :
19 : THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 : ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 : WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 : DISCLAIMED. IN NO EVENT SHALL RANDOLPH VOORHIES OR SHANE GRANT BE LIABLE FOR ANY
23 : DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 : (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 : LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 : ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 : (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 : SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 : */
30 : #ifndef CEREAL_TYPES_STD_OPTIONAL_
31 : #define CEREAL_TYPES_STD_OPTIONAL_
32 :
33 : #include "cereal/cereal.hpp"
34 : #include <optional>
35 :
36 : namespace cereal {
37 : //! Saving for std::optional
38 : template <class Archive, typename T> inline
39 64 : void CEREAL_SAVE_FUNCTION_NAME(Archive& ar, const std::optional<T>& optional)
40 : {
41 64 : if(!optional) {
42 24 : ar(CEREAL_NVP_("nullopt", true));
43 : } else {
44 40 : ar(CEREAL_NVP_("nullopt", false),
45 70 : CEREAL_NVP_("data", *optional));
46 : }
47 64 : }
48 4 :
49 : //! Loading for std::optional
50 4 : template <class Archive, typename T> inline
51 2 : void CEREAL_LOAD_FUNCTION_NAME(Archive& ar, std::optional<T>& optional)
52 : {
53 2 : bool nullopt;
54 4 : ar(CEREAL_NVP_("nullopt", nullopt));
55 :
56 4 : if (nullopt) {
57 4 : optional = std::nullopt;
58 : } else {
59 4 : T value;
60 2 : ar(CEREAL_NVP_("data", value));
61 : optional = std::move(value);
62 2 : }
63 2 : }
64 : } // namespace cereal
65 4 :
66 4 : #endif // CEREAL_TYPES_STD_OPTIONAL_
|