OSDN Git Service

Merge pull request #2122 from sikabane-works/release/3.0.0Alpha52
[hengbandforosx/hengbandosx.git] / src / object / object-index-list.h
1 #pragma once
2
3 #include "system/angband.h"
4
5 #include <list>
6
7 struct floor_type;
8
9 /**
10  * @brief アイテムリスト(床上スタック/モンスター所持)を管理するクラス
11  *
12  * @details object_type 自体を保持するのではなく、フロア全体の object_type 配列上のアイテムの要素番号を保持する
13  */
14 class ObjectIndexList {
15 public:
16     /**
17      * @brief デフォルトコンストラクタ
18      */
19     ObjectIndexList() = default;
20
21     /**
22      * @brief アイテムリストにフロア全体のアイテム配列上の指定した要素番号のアイテムを追加する
23      *
24      * @details
25      * stack_idx が非負数の場合、アイテムリストの stack_idx で指定した位置に追加する。
26      * (リストに含まれるアイテムの stack_idx は降順で並んでいるものと想定し、その順序を崩さない位置に追加する)
27      *
28      * stack_idx が0または負数の場合、アイテムリストの先頭に追加する。
29      * また、追加したアイテムの stack_idx を追加前のアイテムリストの先頭のアイテムの stack_idx + 1 にする。
30      *
31      * @param floor_ptr 追加するアイテムが存在するフロアへのポインタ
32      * @param o_idx 追加するアイテムのフロア全体のアイテム配列上の要素番号
33      * @param stack_idx アイテムリストに追加する位置(デフォルト:0)
34      */
35     void add(floor_type *floor_ptr, OBJECT_IDX o_idx, IDX stack_idx = 0);
36
37     /**
38      * @brief アイテムリストからフロア全体のアイテム配列上の指定した要素番号のアイテムを削除する
39      *
40      * @param o_idx 削除するアイテムのフロア全体のアイテム配列上の要素番号
41      */
42     void remove(OBJECT_IDX o_idx);
43
44     /**
45      * @brief アイテムリストの先頭のアイテムを最後尾に移動させる
46      *
47      * @details
48      * アイテムリストに含まれる各アイテムの stack_idx の降順を崩さないようにするため、
49      * 先頭のアイテムを最後尾に移動した後各アイテムの stack_idx は1ずつインクリメントされ、
50      * 最後尾に移動したアイテムの stack_idx は 1 になる。
51      */
52     void rotate(floor_type *floor_ptr);
53
54     //
55     // 以下のメソッドは内部で保持している std::list オブジェクトに対して使用できる同名のメソッド
56     //
57     auto empty() const noexcept
58     {
59         return o_idx_list_.empty();
60     }
61     auto size() const noexcept
62     {
63         return o_idx_list_.size();
64     }
65     void clear() noexcept
66     {
67         o_idx_list_.clear();
68     }
69     auto &front() noexcept
70     {
71         return o_idx_list_.front();
72     }
73     void pop_front() noexcept
74     {
75         return o_idx_list_.pop_front();
76     }
77     auto begin() noexcept
78     {
79         return o_idx_list_.begin();
80     }
81     auto end() noexcept
82     {
83         return o_idx_list_.end();
84     }
85     auto begin() const noexcept
86     {
87         return o_idx_list_.begin();
88     }
89     auto end() const noexcept
90     {
91         return o_idx_list_.end();
92     }
93
94 private:
95     std::list<OBJECT_IDX> o_idx_list_;
96 };