aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/almalloc.h7
-rw-r--r--common/aloptional.h4
2 files changed, 8 insertions, 3 deletions
diff --git a/common/almalloc.h b/common/almalloc.h
index e0847eb1..df24c4a9 100644
--- a/common/almalloc.h
+++ b/common/almalloc.h
@@ -104,6 +104,11 @@ bool operator!=(const allocator<T,N>&, const allocator<U,M>&) noexcept { return
template<size_t alignment, typename T>
[[gnu::assume_aligned(alignment)]] inline T* assume_aligned(T *ptr) noexcept { return ptr; }
+
+template<typename T, typename ...Args>
+constexpr T* construct_at(T *ptr, Args&&...args) noexcept(noexcept(T{std::forward<Args>(args)...}))
+{ return ::new(static_cast<void*>(ptr)) T{std::forward<Args>(args)...}; }
+
/* At least VS 2015 complains that 'ptr' is unused when the given type's
* destructor is trivial (a no-op). So disable that warning for this call.
*/
@@ -250,7 +255,7 @@ struct FlexArray {
static std::unique_ptr<FlexArray> Create(index_type count)
{
void *ptr{al_calloc(alignof(FlexArray), Sizeof(count))};
- return std::unique_ptr<FlexArray>{new(ptr) FlexArray{count}};
+ return std::unique_ptr<FlexArray>{al::construct_at(static_cast<FlexArray*>(ptr), count)};
}
FlexArray(index_type size) : mStore{size} { }
diff --git a/common/aloptional.h b/common/aloptional.h
index a8ca18ba..0eafd4d1 100644
--- a/common/aloptional.h
+++ b/common/aloptional.h
@@ -58,9 +58,9 @@ class optional {
storage_t mStore;
template<typename... Args>
- void doConstruct(Args&& ...args)
+ void doConstruct(Args&& ...args) noexcept(noexcept(al::construct_at(std::declval<T*>(), std::forward<Args>(args)...)))
{
- ::new(std::addressof(mStore.mValue)) T{std::forward<Args>(args)...};
+ al::construct_at(std::addressof(mStore.mValue), std::forward<Args>(args)...);
mStore.mHasValue = true;
}