Struct ObjectStorage

Synopsis

#include <include/internal/benchmark/catch_constructor.hpp>

template <typename T, bool Destruct>
struct ObjectStorage

Description

No description yet.

Mentioned in

  • Other / Release Notes / Fixes

Methods

ObjectStorage overload
~ObjectStorage
construct

Mentioned in

destruct

Mentioned in

Source

Lines 19-68 in include/internal/benchmark/catch_constructor.hpp.

template <typename T, bool Destruct>
struct ObjectStorage
{
    using TStorage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;
    ObjectStorage() : data() {}
    ObjectStorage(const ObjectStorage& other)
    {
        new(&data) T(other.stored_object());
    }
    ObjectStorage(ObjectStorage&& other)
    {
        new(&data) T(std::move(other.stored_object()));
    }
    ~ObjectStorage() { destruct_on_exit<T>(); }
    template <typename... Args>
    void construct(Args&&... args)
    {
        new (&data) T(std::forward<Args>(args)...);
    }
    template <bool AllowManualDestruction = !Destruct>
    typename std::enable_if<AllowManualDestruction>::type destruct()
    {
        stored_object().~T();
    }
private:
    // If this is a constructor benchmark, destruct the underlying object
    template <typename U>
    void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) { destruct<true>(); }
    // Otherwise, don't
    template <typename U>
    void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) { }
    T& stored_object() {
        return *static_cast<T*>(static_cast<void*>(&data));
    }
    T const& stored_object() const {
        return *static_cast<T*>(static_cast<void*>(&data));
    }
    TStorage data;
};





Add Discussion as Guest

Log in