-
Notifications
You must be signed in to change notification settings - Fork 741
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add serialization support for C++17 std::optional and std::variant #448
Conversation
For its unit tests to run, pass -DCMAKE_CXX_STANDARD=17 to cmake.
👍 would love to see this merged as soon as possible! :-) |
Thanks! I'd like to add something in the spirit of #256 for |
This looks good overall - I think some of the files have been misplaced in your commit but I can easily resolve this. The develop branch has also moved to a slightly different form for the unittests where the test and implementation are split amongst hpp/cpp files, but again I can do this easily myself as well. Regarding #256, which I honestly must have missed, feel free to make a separate PR regarding that kind of change. |
I just tried to fix everything and merge this but it was taking a bit longer than I expected. Here are detailed changes that need to be made:
I would also prefer to add a I actually did all of these but then got stuck on the next issue: When we compile with a compiler that does not support C++17, the unit tests that require C++17 should not even be generated. Otherwise what we see in the output is a blank executable that passes all tests, when in actuality there is no test to perform. So we need to add both a list of tests that require C++17 as well as check the C++ version in CMAKE. I got stuck on the latter half of this, so if anyone knows a good way to perform this check (across all operating systems) please let me know. Also this is a good example of how even an innocuous looking PR can turn into a lot of work! |
I think pybind11 may have a solution for that, I think they detect the available C++ standard (and also allow the user to override it IIRC). You could have a look at their repo and probably the |
Wow @AzothAmmo that was a fast and thorough, thanks a lot for fixing all my issues--I take note so next time I hope to be more conforming. With regard to the open question: could you just use the There is also this, but this is for core language features, no standard library features: https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html A last technique is to use the traditional What do you think? |
@arximboldi The fine-grained But yes I think reading the value of |
|
template <class Archive, typename T> inline | ||
void CEREAL_SAVE_FUNCTION_NAME(Archive& ar, const std::optional<T>& optional) | ||
{ | ||
if(optional) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is the wrong way round. Shouldn't it be if(!optional)
? I.e. if the optional is empty, then we store nullopt true, otherwise, we serialise nullopt false plus the content. @arximboldi
You are right! I changed the name of the member when adapting the
`boost::optional` code without realizing I was negating its meaning.
Sorry about that!
…--
∿∿∿ https://sinusoid.al
∿∿∿ https://sinusoid.es
|
Ok, cool!
|
Forget what I said above, there was a stupid mistake. I shouldn't have negated the check in All working now :-) 👍 |
Hi, any updates on completing/merging this? :-O Would love to see it in the official master or develop branch as soon as possible, along with my fix #450. |
Are you talking to me @patrikhuber, is there any follow up I should act on? |
@arximboldi I'm not sure actually :-) Maybe @AzothAmmo could let us know whether there's anything we should do? |
Update: Ignore this comment, it compiles fine on gcc-7, but it errors on clang-5, but it hasn't got anything to do with this PR, it's a clang bug. |
Are you sure it compiles fine with clang-5? In the line you linked, process starts with /usr/bin/clang++-5.0 -I/usr/include/opencv .... |
@furkanusta clang uses libstdc++ by default, so yes it compiles fine with |
I was referring to line 6855
It looks like the failing build is using clang++-5.0, not g++-7 Because there is already a bug report for this issue for clang According to debian, it is a clang bug and not because of cereal, though I am not sure if workarounds exist |
@furkanusta Oh, you're absolutely correct, apologies. I read it exactly the opposite way. It compiles fine on g++-7, but not on clang-5. And you're correct, this has absolutely nothing to do with this PR, so ignore my comments regarding that. |
Going to look into wrapping this up tonight
…-----Original Message-----
From: "Patrik Huber" <notifications@github.com>
Sent: 11/19/2017 10:44 AM
To: "USCiLab/cereal" <cereal@noreply.github.com>
Cc: "Shane Grant" <w.shane.grant@gmail.com>; "Mention" <mention@noreply.github.com>
Subject: Re: [USCiLab/cereal] Add serialization support for C++17std::optional and std::variant (#448)
@furkanusta Oh, you're absolutely correct, apologies. I read it exactly the opposite way. It compiles fine on g++-7, but not on clang-5. And you're correct, this has absolutely nothing to do with this PR, so ignore my comments regarding that.
That's quite an annoying bug actually. I encountered a bug with variant + libstdc++ earlier in the year with clang-4 but it then disappeared when I switched to clang-5, and everything was fine. This will be quite annoying, it probably means it'll be ages before we get to use std::variant on AppleClang/XCode... :-(
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub, or mute the thread.
|
Blocked by #423 which fixes some warnings/other things that new compilers will complain about. Almost have that fixed but not quite. |
This now correctly saves the optional value, see USCiLab#448.
Also addresses USCiLab#473. A solution that prevents code duplication is the ultimate goal but this will be fine for now.
The optional serializer doesn't seem to work with non-default-constructible types, if even if a |
Progress towards USCiLab#448 Lots of warnings from g++7.2, these are addressed in USCiLab#423 which hasn't been merged yet. CMAKE can be cleaned up a bit - may put back in the ability to use older cmake and just throw errors as necessary, otherwise just force people to use at least cmake 3.1
This now correctly saves the optional value, see USCiLab#448.
Also addresses USCiLab#473. A solution that prevents code duplication is the ultimate goal but this will be fine for now.
Progress towards USCiLab#448 Lots of warnings from g++7.2, these are addressed in USCiLab#423 which hasn't been merged yet. CMAKE can be cleaned up a bit - may put back in the ability to use older cmake and just throw errors as necessary, otherwise just force people to use at least cmake 3.1
This now correctly saves the optional value, see USCiLab#448.
Also addresses USCiLab#473. A solution that prevents code duplication is the ultimate goal but this will be fine for now.
Possibly a consequence of #506 ? |
Progress towards USCiLab#448 Lots of warnings from g++7.2, these are addressed in USCiLab#423 which hasn't been merged yet. CMAKE can be cleaned up a bit - may put back in the ability to use older cmake and just throw errors as necessary, otherwise just force people to use at least cmake 3.1
This now correctly saves the optional value, see USCiLab#448.
Also addresses USCiLab#473. A solution that prevents code duplication is the ultimate goal but this will be fine for now.
Cereal updated for work being done in another branch. This bump fixes some issues with the library. Tested v1.3.1 Bug fixes and minor enhancements: Fix typo in docs by @tankorsmash in Fix typo in docs USCiLab/cereal#597 Add MSVC 2019 to build, default ctor for static object by @AzothAmmo in Add MSVC 2019 to build, default ctor for static object USCiLab/cereal#593 Fix json.hpp compilation issue when int32_t is a long by @bblackham in Fix json.hpp compilation issue when int32_t is a long USCiLab/cereal#621 [cpp20] explicitly capture 'this' as copy by @lukaszgemborowski in [cpp20] explicitly capture 'this' as copy USCiLab/cereal#640 Fix rapidjson for Clang 10 by @groscoe2 in Fix rapidjson for Clang 10 USCiLab/cereal#645 Fixes to prevent clang-diagnostic errors by @johngladp in Fixes to prevent clang-diagnostic errors USCiLab/cereal#643 cleanup cmake files to be a little more moderen by @ClausKlein in cleanup cmake files to be a little more moderen USCiLab/cereal#659 GHSA-wgww-fh2f-c855: Store a copy of each serialized shared_ptr within the archive to prevent the shared_ptr to be freed to early. by @serpedon in CVE-2020-11105: Store a copy of each serialized shared_ptr within the archive to prevent the shared_ptr to be freed to early. USCiLab/cereal#667 add license files for components of cereal by @miartad in add license files for components of cereal USCiLab/cereal#676 Catch short documents in JSON input by @johnkeeping in Catch short documents in JSON input USCiLab/cereal#677 C++17: use inline globals for StaticObjects by @InBetweenNames in C++17: use inline globals for StaticObjects USCiLab/cereal#657 Use std::variant::emplace when loading by @kepler-5 in Use std::variant::emplace when loading USCiLab/cereal#699 Use std::optional::emplace() when loading non-empty optional by @kepler-5 in Use std::optional::emplace() when loading non-empty optional USCiLab/cereal#698 Fix itsNextName not clearing when not found + style change by @AzothAmmo in Fix itsNextName not clearing when not found + style change USCiLab/cereal#715 Update doctest to 2.4.6 + local fixes slated for upstream by @AzothAmmo in Update doctest to 2.4.6 + local fixes slated for upstream USCiLab/cereal#716 Fixed loading of std::vector by @Darred in Fixed loading of std::vector<bool> USCiLab/cereal#732 Update license to match BSD template by @AzothAmmo in Update license to match BSD template USCiLab/cereal#735 Update doctest to 2.4.7 by @AzothAmmo in Update doctest to 2.4.7 USCiLab/cereal#736 Use GNUInstallDirs instead of hard wiring install directories by @antonblanchard in Use GNUInstallDirs instead of hard wiring install directories USCiLab/cereal#710 This is not an exhaustive list of changes or individual contributions. See the closed issues or complete changelog for more information. v1.3.0 New features include: Deferred serialization for smart pointers (Stack overflow for large chains of shared_ptr (or smart pointers in general) USCiLab/cereal#185) Initial support for C++17 standard library variant and optional (thanks to @arximboldi, Add serialization support for C++17 std::optional and std::variant USCiLab/cereal#448) Support for std::atomic (thanks to @bluescarni, Implementation and testing of std::atomic serialization. USCiLab/cereal#277) Fixes and enhancements include: Vastly improved continuous integration testing (Appveyor updates + boost testing fixes USCiLab/cereal#568, Update Travis CI USCiLab/cereal#569) Fixed several issues related to compilation on newer compilers (Fixing various compilation warnings USCiLab/cereal#579, Add fall through comments to json.hpp USCiLab/cereal#587, Fix warning unused private member itsValueItEnd USCiLab/cereal#515) Fixed warnings with -Wconversion and -Wdocumentation (thanks to @WSoptics, Develop USCiLab/cereal#423) Performance improvements for polymorphic serialization (PolymorphicVirtualCaster StaticObject instantiation takes a very long time at app startup USCiLab/cereal#354) Minor fixes and enhancements include: Fixed a bug related to CEREAL_REGISTER_DYNAMIC_INIT with shared libraries (thanks to @m2tm, Issue correctly using CEREAL_REGISTER_DYNAMIC_INIT USCiLab/cereal#523) Avoid unnecessary undefined behavior with StaticObject (thanks to @erichkeane, Change StaticObject instance management to hopefully avoid UBSAN USCiLab/cereal#470) New version.hpp file describes cereal version (detect cereal version at compile time / version.hpp USCiLab/cereal#444) Ability to disable size=dynamic attribute in the XML archive (thanks to @hoensr, Add option to turn off the size=dynamic attributes of lists USCiLab/cereal#401) Other Notes The static checking for minimal serialization has been relaxed as there were many legitimate cases it was interfering with (thanks to @h-2, remove const check from load_minimal USCiLab/cereal#565) The vs2013 directory has been removed in favor of generating solutions with CMake (Remove vs2013 directory USCiLab/cereal#574)
The test and code has been written in similar style to that of the existing support for
boost_variant
, I hope this is fine. For the tests to run one shall pass-DCMAKE_CXX_STANDARD=17
tocmake
.