From b032619a9cb1850dcbb1381b1e77ca1d7c2a00a7 Mon Sep 17 00:00:00 2001 From: jebes Date: Mon, 13 Oct 2014 16:00:09 -0400 Subject: Commented most of src/serialization/ going to read up more on variant's and finish off the job/add last touchs next --- src/serialization/variant.h | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'src/serialization/variant.h') diff --git a/src/serialization/variant.h b/src/serialization/variant.h index 3b03f1ba5..9b5d54237 100644 --- a/src/serialization/variant.h +++ b/src/serialization/variant.h @@ -28,6 +28,12 @@ // // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers +/*! \file variant.h + * + * \brief for dealing with variants + * + * \detailed Variant: OOP Union + */ #pragma once #include @@ -39,11 +45,21 @@ #include #include "serialization.h" +/*! \struct variant_serialization_triats + * + * \brief used internally to contain a variant's traits/possible types + * + * \detailed see the macro VARIANT_TAG in serialization.h:140 + */ template struct variant_serialization_traits { }; +/*! \struct variant_reader + * + * \brief reads a variant + */ template struct variant_reader { @@ -51,9 +67,10 @@ struct variant_reader typedef typename boost::mpl::next::type TNext; typedef typename boost::mpl::deref::type current_type; + // A tail recursive inline function.... okay... static inline bool read(Archive &ar, Variant &v, variant_tag_type t) { - if (variant_serialization_traits::get_tag() == t) { + if(variant_serialization_traits::get_tag() == t) { current_type x; if(!::do_serialize(ar, x)) { @@ -62,12 +79,15 @@ struct variant_reader } v = x; } else { + // Tail recursive.... but no mutation is going on. Why? return variant_reader::read(ar, v, t); } return true; } }; +// This one just fails when you call it.... okay +// So the TEnd parameter must be specified/differnt from TBegin template struct variant_reader { @@ -78,7 +98,6 @@ struct variant_reader ar.stream().setstate(std::ios::failbit); return false; } - }; @@ -93,7 +112,9 @@ struct serializer, boost::variant> variant_tag_type t; ar.begin_variant(); ar.read_variant_tag(t); - if(!variant_reader, variant_type, typename boost::mpl::begin::type, typename boost::mpl::end::type>::read(ar, v, t)) + if(!variant_reader, variant_type, + typename boost::mpl::begin::type, + typename boost::mpl::end::type>::read(ar, v, t)) { ar.stream().setstate(std::ios::failbit); return false; -- cgit v1.2.3