You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.0 KiB
C++
65 lines
2.0 KiB
C++
/*
|
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
|
* its licensors.
|
|
*
|
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
|
* distribution (the "License"). All use of this software is governed by the License,
|
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
*
|
|
*/
|
|
// Original file Copyright Crytek GMBH or its affiliates, used under license.
|
|
|
|
// Description : Helper to enable inplace construction and destruction of objects
|
|
|
|
#ifndef CRYINCLUDE_CRYCOMMON_STACKCONTAINER_H
|
|
#define CRYINCLUDE_CRYCOMMON_STACKCONTAINER_H
|
|
#pragma once
|
|
|
|
#include <InplaceFactory.h>
|
|
|
|
// Class that contains a non-pod data type allocated on the stack via placement
|
|
// new. Constructor parameters up to an arity of 5 are forwarded over an
|
|
// inplace factory expression.
|
|
template<typename T>
|
|
class CStackContainer
|
|
{
|
|
// The backing storage
|
|
uint8 m_Storage[ sizeof (T) ];
|
|
|
|
// Constructs the object via an inplace factory
|
|
template<class Factory>
|
|
void construct (const Factory& factory)
|
|
{
|
|
factory.template apply<T>(m_Storage);
|
|
}
|
|
|
|
// Destructs the object. The destructor of the contained object is called
|
|
void destruct ()
|
|
{
|
|
reinterpret_cast<T*>(m_Storage)->~T();
|
|
}
|
|
|
|
// Prevent the object to be placed on the heap
|
|
// (.... it simply wouldn't make much sense)
|
|
void* operator new(size_t);
|
|
void operator delete(void*);
|
|
|
|
public:
|
|
|
|
// Constructs inside the object
|
|
template<class Expr>
|
|
CStackContainer (const Expr& expr)
|
|
{ construct(expr); }
|
|
|
|
// Destructs the object contained
|
|
~CStackContainer() { destruct(); }
|
|
|
|
// Accessor methods
|
|
T* get() { return reinterpret_cast<T*>(m_Storage); }
|
|
const T* get() const { return reinterpret_cast<const T*>(m_Storage); }
|
|
};
|
|
|
|
#endif // CRYINCLUDE_CRYCOMMON_STACKCONTAINER_H
|