16 #ifndef INCLUDE_NN_NLIB_NQUEUE_H_ 17 #define INCLUDE_NN_NLIB_NQUEUE_H_ 21 #include "nn/nlib/Swap.h" 27 extern void* nqueue_enabler;
29 template <
class T,
class AL = std::allocator<
char> >
34 NLIB_MOVE_MEMBER_HELPER_5(
Nqueue, beg1_, end1_, beg2_, end2_, list_)
35 size_t size() const
NLIB_NOEXCEPT {
return (end1_ - beg1_) + (end2_ - beg2_); }
39 #ifdef NLIB_CXX11_RVALUE_REFERENCES 44 return this->pop_front_swap(&tmp);
47 T* tmp = this->push_back();
48 if (!tmp || !v)
return false;
56 swap(beg1_, rhs.beg1_);
57 swap(end1_, rhs.end1_);
58 swap(beg2_, rhs.beg2_);
59 swap(end2_, rhs.end2_);
60 swap(list_, rhs.list_);
72 template <
class T,
class AL>
74 if (end1_ != beg2_ && beg2_ != end2_) {
76 swap(list_[end1_++], list_[beg2_++]);
78 swap(list_[end1_++], list_[beg2_++]);
86 if (list_.
size() == end2_) {
91 return &list_[end2_++];
95 #ifdef NLIB_CXX11_RVALUE_REFERENCES 96 template <
class T,
class AL>
98 if (end1_ != beg2_ && beg2_ != end2_) {
100 swap(list_[end1_++], list_[beg2_++]);
101 if (beg2_ != end2_) {
102 swap(list_[end1_++], list_[beg2_++]);
104 if (beg2_ == end2_) {
110 if (list_.
size() == end2_) {
111 #ifdef NLIB_HAS_NATIVE_TYPETRAITS 114 T* tmp = list_.
push_back(std::move(rhs));
118 #ifdef NLIB_HAS_NATIVE_TYPETRAITS 121 list_[end2_] = std::move(rhs);
122 return &list_[end2_++];
127 template <
class T,
class AL>
129 if (!v)
return false;
131 if (beg1_ != end1_) {
132 swap(*v, list_[beg1_++]);
133 if (beg1_ == end1_) {
135 }
else if ((end1_ - beg1_) * 8 < end1_) {
136 uint32_t cnt =
static_cast<uint32_t
>(end1_ - beg1_);
137 for (uint32_t i = 0; i < cnt; ++i) {
138 swap(list_[i], list_[beg1_ + i]);
143 }
else if (beg2_ != end2_) {
144 NLIB_ASSERT(beg1_ + end1_ == 0);
145 swap(*v, list_[beg2_++]);
146 if (beg2_ == end2_) beg2_ = end2_ = 0;
155 #ifndef NLIB_STD_SWAP_WORKAROUND 158 NLIB_DEFINE_STD_SWAP_T_BEGIN1(
std)
161 NLIB_DEFINE_STD_SWAP_T1(AL, NLIB_NS::Nqueue)
163 #ifndef NLIB_STD_SWAP_WORKAROUND 166 NLIB_DEFINE_STD_SWAP_T_END1(
std)
169 #endif // INCLUDE_NN_NLIB_NQUEUE_H_ ~Nqueue() noexcept
デストラクタです。
bool push_back_swap(T *v) noexcept
キューに要素を追加してから、その要素とvをstd::swapによって交換します。
C++11の標準ヘッダとなるtype_traitsの代用定義です。 コンパイラや標準ライブラリによってサポートされてい...
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
std::queueに似た、コピーコンストラクタを持たないオブジェクトを格納可能なコンテナ類似クラスです。 ...
Nqueue() noexcept
デフォルトコンストラクタです。空のキューを作成します。
void swap(Nqueue &rhs) noexcept
コンテナをスワップします。
pointer push_back()
末尾に要素を追加してデフォルトコンストラクタで初期化します。
std::vectorに似ていますが、コピーできないオブジェクトを格納可能なクラスが定義されています。 ...
bool pop_front() noexcept
先頭の要素をキューから取り出します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
std::vectorに似た、コピーコンストラクタを持たないオブジェクトを格納可能なコンテナ類似クラスです。 ...
bool empty() const noexcept
コンテナが空かどうかを調べます。
size_type size() const noexcept
格納されている要素の個数を返します。
#define NLIB_STATIC_ASSERT(exp)
静的アサートが定義されます。利用可能であればstatic_assertを利用します。
size_t capacity() const noexcept
アロケート済みの要素の個数を返します。