summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/plists.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/plists.h')
-rw-r--r--src/lib/netlist/plib/plists.h18
1 files changed, 11 insertions, 7 deletions
diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h
index 4e1454a7d30..718aab95cb8 100644
--- a/src/lib/netlist/plib/plists.h
+++ b/src/lib/netlist/plib/plists.h
@@ -13,6 +13,7 @@
#include <algorithm>
#include <stack>
#include <vector>
+#include <type_traits>
#include "palloc.h"
#include "pstring.h"
@@ -105,22 +106,25 @@ public:
~uninitialised_array_t()
{
for (std::size_t i=0; i<N; i++)
- {
- C &r = (*this)[i];
- r.~C();
- }
+ (*this)[i].~C();
}
size_t size() { return N; }
C& operator[](const std::size_t &index)
{
- return *reinterpret_cast<C *>(reinterpret_cast<char *>(m_buf) + index * sizeof(C));
+ return *reinterpret_cast<C *>(&m_buf[index]);
}
const C& operator[](const std::size_t &index) const
{
- return *reinterpret_cast<C *>(reinterpret_cast<char *>(m_buf) + index * sizeof(C));
+ return *reinterpret_cast<C *>(&m_buf[index]);
+ }
+
+ template<typename... Args>
+ void emplace(const std::size_t index, Args&&... args)
+ {
+ new (&m_buf[index]) C(std::forward<Args>(args)...);
}
protected:
@@ -128,7 +132,7 @@ protected:
private:
/* ensure proper alignment */
- UINT64 m_buf[(N * sizeof(C) + sizeof(UINT64) - 1) / sizeof(UINT64)];
+ typename std::aligned_storage<sizeof(C), alignof(C)>::type m_buf[N];
};
// ----------------------------------------------------------------------------------------