/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* * A class storing one of two optional value types that supports in-place lazy * construction.
*/
/* * MaybeOneOf<T1, T2> is like Maybe, but it supports constructing either T1 * or T2. When a MaybeOneOf<T1, T2> is constructed, it is |empty()|, i.e., * no value has been constructed and no destructor will be called when the * MaybeOneOf<T1, T2> is destroyed. Upon calling |construct<T1>()| or * |construct<T2>()|, a T1 or T2 object will be constructed with the given * arguments and that object will be destroyed when the owning MaybeOneOf is * destroyed. * * Because MaybeOneOf must be aligned suitable to hold any value stored within * it, and because |alignas| requirements don't affect platform ABI with respect * to how parameters are laid out in memory, MaybeOneOf can't be used as the * type of a function parameter. Pass MaybeOneOf to functions by pointer or * reference instead.
*/ template <class T1, class T2> class MOZ_NON_PARAM MaybeOneOf { static constexpr size_t StorageAlignment =
tl::Max<alignof(T1), alignof(T2)>::value; static constexpr size_t StorageSize = tl::Max<sizeof(T1), sizeof(T2)>::value;
// GCC fails due to -Werror=strict-aliasing if |storage| is directly cast to // T*. Indirecting through these functions addresses the problem. void* data() { return storage; } constvoid* data() const { return storage; }
enum State { None, SomeT1, SomeT2 } state; template <class T, class Ignored = void> struct Type2State {};
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.