X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/35f70d169f6bc2a00b0ffca8bfd388516c4af70f..403febcac54e1d61d3196b3efb80035f883cfc85:/data/variant.hh diff --git a/data/variant.hh b/data/variant.hh index 684f9e35..5ff0c54d 100644 --- a/data/variant.hh +++ b/data/variant.hh @@ -1,6 +1,6 @@ # C++ skeleton for Bison -# Copyright (C) 2002-2012 Free Software Foundation, Inc. +# Copyright (C) 2002-2013 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -51,13 +51,6 @@ m4_define([_b4_char_sizeof_dummy], dummy[]_b4_char_sizeof_counter]) -# b4_char_sizeof_(SYMBOL-NUM) -# --------------------------- -# A comment describing this symbol. -m4_define([b4_char_sizeof_], -[ // b4_symbol([$1], [tag]) -]) - # b4_char_sizeof(SYMBOL-NUMS) # --------------------------- # To be mapped on the list of type names to produce: @@ -69,7 +62,7 @@ m4_define([b4_char_sizeof_], m4_define([b4_char_sizeof], [b4_symbol_if([$1], [has_type], [ -m4_map([b4_char_sizeof_], [$@])dnl +m4_map([ b4_symbol_tag_comment], [$@])dnl char _b4_char_sizeof_dummy@{sizeof([b4_symbol([$1], [type])])@}; ])]) @@ -79,6 +72,7 @@ m4_map([b4_char_sizeof_], [$@])dnl # The needed includes for variants support. m4_define([b4_variant_includes], [b4_parse_assert_if([[#include ]])[ +#include // abort #ifndef YYASSERT # include # define YYASSERT assert @@ -112,8 +106,8 @@ m4_define([b4_variant_define], inline T& build () {]b4_parse_assert_if([ - YYASSERT (!built); - YYASSERT (!tname); + //YYASSERT (!built); + //YYASSERT (!tname); YYASSERT (sizeof (T) <= S); built = true; tname = typeid (T).name ();])[ @@ -125,8 +119,8 @@ m4_define([b4_variant_define], inline T& build (const T& t) {]b4_parse_assert_if([ - YYASSERT (!built); - YYASSERT (!tname); + //YYASSERT (!built); + //YYASSERT (!tname); YYASSERT (sizeof (T) <= S); built = true; tname = typeid (T).name ();])[ @@ -167,27 +161,43 @@ m4_define([b4_variant_define], } /// Swap the content with \a other, of same type. + /// Both variants must be built beforehand, because swapping the actual + /// data requires reading it (with as()), and this is not possible on + /// unconstructed variants: it would require some dynamic testing, which + /// should not be the variant's responsability. + /// Swapping between built and ((possibly) non-built is done with + /// variant::move (). template inline void swap (variant& other) {]b4_parse_assert_if([ + YYASSERT (built); + YYASSERT (other.built); YYASSERT (tname == other.tname);])[ - std::swap (as(), other.as());]b4_parse_assert_if([ - std::swap (built, other.built); - std::swap (tname, other.tname);])[ + std::swap (as(), other.as()); } /// Assign the content of \a other to this. /// Destroys \a other. template inline void - build (variant& other) - { + move (variant& other) + {]b4_parse_assert_if([ + YYASSERT (! built);])[ build(); swap(other); other.destroy(); } + /// Copy the content of \a other to this. + /// Destroys \a other. + template + inline void + copy (const variant& other) + { + build (other.as ()); + } + /// Destroy the stored \a T. template inline void @@ -198,6 +208,18 @@ m4_define([b4_variant_define], tname = YY_NULL;])[ } + /// Prohibit blind copies. + private: + self_type& operator=(const self_type&) + { + abort (); + } + + variant (const self_type&) + { + abort (); + } + private: /// A buffer large enough to store any of the semantic values. /// Long double is chosen as it has the strongest alignment