nlib
DynamicAlignedStorage.h
[詳解]
1 
2 #pragma once
3 #ifndef INCLUDE_NN_NLIB_DYNAMICALIGNEDSTORAGE_H_
4 #define INCLUDE_NN_NLIB_DYNAMICALIGNEDSTORAGE_H_
5 
6 #include "nn/nlib/Config.h"
7 
8 NLIB_NAMESPACE_BEGIN
9 
11  public:
12  DynamicAlignedStorage() NLIB_NOEXCEPT : storage_(NULL) {}
13  NLIB_MOVE_MEMBER_HELPER_1(DynamicAlignedStorage, storage_)
14  errno_t Init(size_t size, size_t align) NLIB_NOEXCEPT {
15  if (align == 0) return EINVAL;
16  if ((align & (align - 1)) != 0) return EINVAL;
17 #ifdef NN_PLATFORM_CTR
18  void* p = nlib_malloc(size + align);
19 #elif defined(_MSC_VER)
20  void* p = _aligned_malloc(size, align);
21 #else
22  void* p = nlib_memalign(size, align);
23 #endif
24  if (!p) return ENOMEM;
25  storage_ = p;
26 #ifdef NN_PLATFORM_CTR
27  align_ = align;
28 #endif
29  return 0;
30  }
32  void* tmp = rhs.storage_;
33  rhs.storage_ = storage_;
34  storage_ = tmp;
35  }
37 #ifdef _MSC_VER
38  _aligned_free(storage_);
39 #else
40  nlib_free(storage_);
41 #endif
42  }
43  void* Get() NLIB_NOEXCEPT {
44 #ifndef NN_PLATFORM_CTR
45  return storage_;
46 #else
47  uintptr_t pos = (reinterpret_cast<uintptr_t>(storage_) + (align_ - 1)) & ~(align_ - 1);
48  return reinterpret_cast<void*>(pos);
49 #endif
50  }
51 
52  private:
53  void* storage_;
54 #ifdef NN_PLATFORM_CTR
55  size_t align_;
56 #endif
58 };
59 
60 NLIB_ALWAYS_INLINE void swap(DynamicAlignedStorage& lhs,
61  DynamicAlignedStorage& rhs) NLIB_NOEXCEPT {
62  lhs.swap(rhs);
63 }
64 
65 NLIB_NAMESPACE_END
66 
67 #endif // INCLUDE_NN_NLIB_DYNAMICALIGNEDSTORAGE_H_
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
Definition: Platform.h:2151
NLIB_CHECK_RESULT void * nlib_memalign(size_t alignment, size_t size)
memalign()を呼び出すweak関数です。nlibはこの関数を経由してmemalign()を呼び出します。 ...
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
Definition: Config.h:126
~DynamicAlignedStorage() noexcept
デストラクタです。
アラインされたメモリを得るためのクラスです。
NLIB_CHECK_RESULT void * nlib_malloc(size_t size)
C標準関数のmalloc()を呼び出すweak関数です。nlibはこの関数を経由してmalloc()を呼び出します。 ...
void swap(DynamicAlignedStorage &rhs) noexcept
オブジェクトをスワップします。
void * Get() noexcept
割り当てられた領域へのポインタを返します。
開発環境別の設定が書かれるファイルです。
DynamicAlignedStorage() noexcept
デフォルトコンストラクタです。
#define NLIB_ALWAYS_INLINE
コンパイラに関数をインライン展開するように強く示します。
Definition: Platform_unix.h:59
void nlib_free(void *ptr)
C標準関数のfree()を呼び出すweak関数です。nlibはこの関数を経由してfree()を呼び出します。 ...
int errno_t
intのtypedefで、戻り値としてPOSIXのエラー値を返すことを示します。
Definition: NMalloc.h:24