summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2019-07-19 00:15:53 +0200
committerFernandoS27 <fsahmkow27@gmail.com>2019-07-19 16:06:08 +0200
commit9bede4eeed523f9707a989f1297279c006086e76 (patch)
tree2acfabeff5f7f449bcdb22563f5ad66f7fa5f414 /src/common
parentMerge pull request #2687 from lioncash/tls-process (diff)
downloadyuzu-9bede4eeed523f9707a989f1297279c006086e76.tar
yuzu-9bede4eeed523f9707a989f1297279c006086e76.tar.gz
yuzu-9bede4eeed523f9707a989f1297279c006086e76.tar.bz2
yuzu-9bede4eeed523f9707a989f1297279c006086e76.tar.lz
yuzu-9bede4eeed523f9707a989f1297279c006086e76.tar.xz
yuzu-9bede4eeed523f9707a989f1297279c006086e76.tar.zst
yuzu-9bede4eeed523f9707a989f1297279c006086e76.zip
Diffstat (limited to 'src/common')
-rw-r--r--src/common/alignment.h79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/common/alignment.h b/src/common/alignment.h
index 617b14d9b..b3fbdfe20 100644
--- a/src/common/alignment.h
+++ b/src/common/alignment.h
@@ -3,7 +3,10 @@
#pragma once
#include <cstddef>
+#include <cstdlib>
#include <type_traits>
+#include <malloc.h>
+#include <stdlib.h>
namespace Common {
@@ -37,4 +40,80 @@ constexpr bool IsWordAligned(T value) {
return (value & 0b11) == 0;
}
+template <typename T, std::size_t Align = 16>
+class AlignmentAllocator {
+public:
+ typedef T value_type;
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+
+ typedef T* pointer;
+ typedef const T* const_pointer;
+
+ typedef T& reference;
+ typedef const T& const_reference;
+
+public:
+ inline AlignmentAllocator() throw() {}
+
+ template <typename T2>
+ inline AlignmentAllocator(const AlignmentAllocator<T2, Align>&) throw() {}
+
+ inline ~AlignmentAllocator() throw() {}
+
+ inline pointer adress(reference r) {
+ return &r;
+ }
+
+ inline const_pointer adress(const_reference r) const {
+ return &r;
+ }
+
+#if (defined _MSC_VER)
+ inline pointer allocate(size_type n) {
+ return (pointer)_aligned_malloc(n * sizeof(value_type), Align);
+ }
+
+ inline void deallocate(pointer p, size_type) {
+ _aligned_free(p);
+ }
+#else
+ inline pointer allocate(size_type n) {
+ return (pointer)std::aligned_alloc(Align, n * sizeof(value_type));
+ }
+
+ inline void deallocate(pointer p, size_type) {
+ std::free(p);
+ }
+#endif
+
+ inline void construct(pointer p, const value_type& wert) {
+ new (p) value_type(wert);
+ }
+
+ inline void destroy(pointer p) {
+ p->~value_type();
+ }
+
+ inline size_type max_size() const throw() {
+ return size_type(-1) / sizeof(value_type);
+ }
+
+ template <typename T2>
+ struct rebind {
+ typedef AlignmentAllocator<T2, Align> other;
+ };
+
+ bool operator!=(const AlignmentAllocator<T, Align>& other) const {
+ return !(*this == other);
+ }
+
+ // Returns true if and only if storage allocated from *this
+ // can be deallocated from other, and vice versa.
+ // Always returns true for stateless allocators.
+ bool operator==(const AlignmentAllocator<T, Align>& other) const {
+ return true;
+ }
+};
+
} // namespace Common