MGL::Array#

注意

このクラスは現在試験的に実装されています。今後大きな変更が加えられる可能性がある点にご注意ください。

概要#

MGL::Arrayはメモリ安全性を重視し、範囲外アクセスに寛容なゲーム開発向けの1次元動的配列クラスです。

MGL::Arrayは範囲外のインデックスにアクセスしても未定義動作や例外の送出を行うことはありません。代わりに無効値を返すようになっています。無効値はデフォルトでは0またはデフォルト構築されたオブジェクトが用いられますが、任意に変更可能です。

また、インデックスに使用する型もいずれかの整数型に任意に変更可能です。この機能は限定的な範囲アクセス、インデックス付きの範囲アクセス等の機能と組み合わせることで、より柔軟なインデックスの扱いが可能となります。

配列に使用するメモリリソースはMGL::Memoryから取得するため、必要に応じてカスタマイズされたアロケーターを利用することも可能です。また、MGL::UniquePtrと同様に所有権を持つオブジェクトのみが単独で管理し、解放処理も自動化されています。

同じ特性を備えた2次元配列版のMGL::Array2Dも利用可能です。

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        ...
    };
}

テンプレート引数#

class ValueType

要素の型

class IndexType

要素にアクセスするための座標の型。省略時はsize_t

要件#

ValueTypeはデフォルト構築可能な型である必要があります。

IndexTypeは符号付きまたは符号なしのいずれかの整数型でなければなりません。

利用例#

配列の生成と要素へのアクセス
// int型の配列をサイズ10で生成
MGL::Array<int> array(10);

// インデックス3の要素をトレース表示。
// 特に指定がない場合、数値の配列は0で初期化される。
MGL_TRACE("array[3] = %d", array[3]);

// 要素の内容を書き換えるにはGetPtr()でポインタを取得する必要がある。
// 添字アクセスは読み取り専用なため、array[3] = 3; のような記述は不可。
if (auto *value = array.GetPtr(3); value != nullptr)
{
    *value = 3;
}

// 再度インデックス3の要素をトレース表示
MGL_TRACE("array[3] = %d", array[3]);
実行結果
array[3] = 0
array[3] = 3
詳細
要素への範囲アクセス
// int型の配列をサイズ5で生成
MGL::Array<int> array(5);

// 全ての要素を3で埋める
array.Fill(3);

// ForEach()を用いることでインデックスと共に各々の要素にアクセス可能
array.ForEach([](auto index, const auto &value)
{
    MGL_TRACE("array[%zu] = %d", index, value);
});

// ForRange()を用いることで一部の範囲の要素にアクセス可能。
// ここでは1から3までを7に書き換えている。
array.ForRange(1, 3, [](auto &value)
{
    value = 7;
});

// 書き換え後の全ての要素をトレース表示。
// 一般的な範囲for文も利用可能であり、constを外せば書き換えも可能。
MGL_TRACE("-----------------");
for (const auto &value : array)
{
    MGL_TRACE("%d", value);
}
実行結果
array[0] = 3
array[1] = 3
array[2] = 3
array[3] = 3
array[4] = 3
-----------------
3
7
7
7
3
詳細
無効値と範囲外アクセス
// 配列初期化時に「無効値」を指定可能。
// Get()や添字アクセスで範囲外を指定した場合はこの無効値が返る。
// 無効値を省略した場合、値であれば0が、クラスであればデフォルト構築されたオブジェクトが
// 無効値として設定される。
// ここではサイズに5、無効値に-1のint型配列を生成。
MGL::Array<int> array(5, -1);

// 範囲外アクセスの例。無効値の-1が返る。
MGL_TRACE("array[10] = %d", array[10]);

// 書き換え用にGetPtr()を使用する場合、範囲外を指定するとnullptrが返る。
// すなわち、特定のインデックスのみを書き換える場合はNULLチェックが必須。
if (auto *value = array.GetPtr(10); value != nullptr)
{
    // ここには到達しない
}
実行結果
array[10] = -1
詳細
インデックスに使用する型の変更
// テンプレート引数の第2引数にはインデックスに使用する型も指定可能。
// 符号付きのインデックスを用いることは範囲をより柔軟に扱う場合に有用。
// もちろん、負のインデックスは全て範囲外扱いとなる。
// ここでは、インデックスにもint型を用いるサイズ5のint型配列を生成。
MGL::Array<int, int> array(10);

// xを基準に±3の範囲にアクセスする例。
// ForRange()は範囲外のインデックスをスキップするため、xが2より小さくても
// &valueに範囲外の不正な参照が届くことはない。
const int x = 2;
array.ForRange(x - 3, x + 3, [](auto index, const auto &value)
{
    MGL_TRACE("array[%d] = %d", index, value);  // この場合、indexはint型になる
});
実行結果
array[0] = 0
array[1] = 0
array[2] = 0
array[3] = 0
array[4] = 0
array[5] = 0
詳細

メンバ情報#

種類

名前

内容

バージョン

関数

コンストラクタ

1.1.15+

関数

New

配列の初期化

1.1.15+

関数

Renew

配列の再初期化

1.1.15+

関数

Fill

全ての要素に指定の値を書き込み

1.1.15+

関数

Get

要素の取得

1.1.15+

関数

GetPtr

要素をポインタで取得

1.1.15+

関数

ForEach

関数オブジェクトを用いた全ての要素へのアクセス

1.1.15+

関数

ForRange

関数オブジェクトを用いた指定範囲の要素へのアクセス

1.1.15+

関数

Contains

指定した要素が範囲内に含まれているかを取得

1.1.15+

関数

SetInvalidValue

無効値の取得

1.1.15+

関数

GetSize

サイズの取得

1.1.15+

関数

begin

先頭の要素を指すポインタを取得

1.1.15+

関数

end

末尾の次の要素を指すポインタを取得

1.1.15+

オペレータ

operator=

演算子によるムーブ

1.1.15+

オペレータ

operator[]

添字による要素アクセス

1.1.15+


コンストラクタ#

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        // (1) 配列のサイズを指定して初期化
        explicit Array(
            size_t arraySize = 0,
            Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;

        // (2) サイズと無効値を指定して初期化
        Array(
            size_t arraySize,
            const ValueType &invalidValue,
            Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;

        // (3) 無効値を右辺値参照で指定して初期化
        Array(
            size_t arraySize,
            ValueType &&invalidValue,
            Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;

        // (4) ムーブコンストラクタ
        Array(Array &&rhs) noexcept;

        // (5) コピーコンストラクタの削除
        Array(Array &) = delete;
    };
}

引数#

(1) 配列のサイズを指定して初期化
size_t arraySize

生成する配列のサイズ。省略時は0

MGL::Memory::ClearMode clearMode

配列が使用するメモリリソースのクリア方法。省略事はAuto

(2) サイズと無効値を指定して初期化
size_t arraySize

生成する配列のサイズ

const ValueType &invalidValue

生成する配列に設定する無効値

MGL::Memory::ClearMode clearMode

配列が使用するメモリリソースのクリア方法。省略事はAuto

(3) 無効値を右辺値参照で指定して初期化
size_t arraySize

生成する配列のサイズ

const ValueType &&invalidValue

生成する配列に設定する無効値

MGL::Memory::ClearMode clearMode

配列が使用するメモリリソースのクリア方法。省略事はAuto

(4) ムーブコンストラクタ
Array &&rhs

移動元の配列

説明#

配列を生成・初期化するためのコンストラクタです。

テンプレート引数ValueTypeには各要素の型を、IndexTypeには要素にアクセスする際に指定するインデックスの型を指定します。

ValueTypeはデフォルト構築可能な型である必要があり、各要素の初期値はデフォルト構築された値になります。

IndexTypeの指定を省略した場合はsize_t型になります。

(1) は生成する配列のサイズのみを指定します。このコンストラクタの引数を省略した場合はサイズ0の(無効値のみを持つ)配列を生成します。

(2) と (3) はサイズと同時に無効値を指定して初期化します。無効値は範囲外アクセスの際に代替される読み取り専用の要素です。 (3)は無効値を右辺値参照で渡した際に呼び出され、機能は(2)と同等です。

無効値を指定しなかった場合、ValueType型をデフォルト構築した値が無効値として設定されます。無効値の詳細についてはGetも参照してください。

(1)から(3)までの引数clearModeは、メモリアロケータから配列用に確保したメモリリソースの初期化方法の指定になります。省略またはAutoを指定した場合、ValueTypeがクラスである場合はメモリリソースの初期化をスキップし、それ以外の場合はゼロクリアを行います。それ以外の値についてはMGL::Memory::ClearModeの説明を参照してください。

(4) は他の配列をムーブするためのコンストラクタです。これに伴い、コピーコンストラクタは(5)によって明示的に削除されています。

サイズの変更を伴う配列の初期化はコンストラクタを呼び出した後でもNewにて行えます。また、無効値の再設定はSetInvalidValueにて行えます。

利用例#

// 空のint型配列を生成
MGL::Array<int> emptyArray;

// 空の配列は常に無効値(int型の場合はデフォルトで0)を返す。
// サイズはNew()で後から変更可能。
MGL_TRACE("emptyArray[0] = %d", emptyArray[0]);

// サイズ10、無効値に-1のint型配列を生成
MGL::Array<int> array(10, -1);

// インデックス0から9まではint型のデフォルト値である0が返るが、
// それ以降は無効値に指定した-1が返るようになる。
MGL_TRACE("array[0] = %d", array[0]);
MGL_TRACE("array[30] = %d", array[30]);

// ムーブによって配列の移動が可能。
// この場合はarrayの内容がarray2に移動し、arrayは空となる。
MGL::Array<int> array2(std::move(array));

// コピーは不可
MGL::Array<int> array3(array2);  // コンパイルエラー!!
実行結果
emptyArray[0] = 0
array[0] = 0
array[30] = -1

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


New#

配列の初期化

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        bool New(
            size_t arraySize,
            Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;
    };
}

引数#

size_t arraySize

配列のサイズ

MGL::Memory::ClearMode clearMode

配列が使用するメモリリソースのクリア方法。省略事はAuto

戻り値#

bool

成功時にtrue、失敗時にfalse

説明#

指定したサイズで配列を初期化します。この関数は主にコンストラクタの呼び出し時点でサイズが確定していない場合の使用を想定しています。

既に配列が生成済みだった場合、既存の内容は破棄され新たな配列が生成されます。

引数clearModeは、メモリアロケータから配列用に確保したメモリリソースの初期化方法の指定になります。省略またはAutoを指定した場合、ValueTypeがクラスである場合はメモリリソースの初期化をスキップし、それ以外の場合はゼロクリアを行います。それ以外の値についてはMGL::Memory::ClearModeの説明を参照してください。

配列のサイズ分のメモリリソースを確保できなかった場合、初期化に失敗し戻り値にfalseが返ります。

利用例#

// 一旦空の配列を生成
MGL::Array<int> array;

// 配列をサイズ10で初期化
array.New(10);

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


Renew#

配列の再初期化

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        bool Renew(Memory::ClearMode clearMode = Memory::ClearMode::Auto) noexcept;
    };
}

引数#

MGL::Memory::ClearMode clearMode

配列が使用するメモリリソースのクリア方法。省略事はAuto

戻り値#

bool

成功時にtrue、失敗時にfalse

説明#

現在のサイズで配列を再初期化します。すなわち、全体サイズを変更せずに全ての要素をデフォルト構築し直します。

引数clearModeは、メモリアロケータから配列用に確保したメモリリソースの初期化方法の指定になります。省略またはAutoを指定した場合、ValueTypeがクラスである場合はメモリリソースの初期化をスキップし、それ以外の場合はゼロクリアを行います。それ以外の値についてはMGL::Memory::ClearModeの説明を参照してください。

この関数の呼び出しはNewの引数にGetSizeの戻り値を指定した場合と等価です。

利用例#

// サイズ10のint型配列を生成
MGL::Array<int> array(10);

// 全ての要素を3で埋める
array.Fill(3);

// 0番目の内容を表示
MGL_TRACE("(1) array[0] = %d", array[0]);

// 配列を再初期化
// 全ての要素はデフォルト(int型の場合は0)に戻る
array.Renew();

// もう一度0番目の内容を表示
MGL_TRACE("(2) array[0] = %d", array[0]);
実行結果
(1) array[0] = 3
(2) array[0] = 0

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


Fill#

全ての要素に指定の値を書き込み

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        constexpr void Fill(const ValueType &value) noexcept;
    };
}

引数#

ValueType value

書き込む値

説明#

配列内の全ての要素に引数でした値を書き込みます。

valueはコピー可能なオブジェクトである必要があります。

利用例#

// サイズ10のint型の配列を生成
MGL::Array<int> array(10);

// 全ての要素に 39 を書き込む
array.Fill(39);

// 全ての要素をトレース表示
for (const auto &value : array)
{
    MGL_TRACE("%d", value);
}
実行結果
39
39
39
...

バージョン情報#

MGL 1.1.15
  • 初回リリース


Get#

要素の取得

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        [[nodiscard]] constexpr const ValueType &Get(IndexType index) const noexcept;
    };
}

引数#

IndexType index

要素へのインデックス

戻り値#

const ValueType &

インデックスに対応した要素。範囲外の場合は無効値。

説明#

要素を読み取り専用で取得します。引数index0から要素数-1までのインデックスを指定することで、その値に対応した要素の参照を返します。

この戻り値は読み取り専用であり、取得した要素を書き換えることはできません。値を書き換える必要がある場合はGetPtrForEachForRange、範囲for文のいずれかを使用してください。

範囲外のインデックスを渡した場合、コンストラクタまたはSetInvalidValueで設定した無効値を返します。無効値を明示的に設定していない場合、そのデフォルト値は初期化時に指定したMGL::Memory::ClearModeによって変化します。

戻り値が範囲内の要素であるかを調べる場合はContainsを使用してください。

この関数はoperator[]で代替できます。

利用例#

// サイズ10、無効値-1のint型の配列を生成
MGL::Array<int> array(10, -1);

// 配列の全ての要素を32で埋める
array.Fill(32);

// インデックス3の内容を表示
MGL_TRACE("array[3] = %d", array.Get(3));

// インデックス99(範囲外)の内容を表示
MGL_TRACE("array[99] = %d", array.Get(99));
実行結果
array[3] = 32
array[99] = -1

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


GetPtr#

要素をポインタで取得

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        [[nodiscard]] constexpr ValueType *GetPtr(IndexType index) noexcept;
    };
}

引数#

IndexType index

要素へのインデックス

戻り値#

ValueType *

インデックスに対応した要素へのポインタ。範囲外の場合はnullptr

説明#

要素の書き込み可能なポインタを取得します。引数index0から要素数-1までのインデックスを指定することで、その値に対応した要素のポインタを返します。

引数に範囲外のインデックスを渡した場合はnullptrが返ります。安全のため、この関数の戻り値は必ずNULLチェックを行ってください。

この関数は特定の要素の内容を書き換える場合にのみ使用してください。書き換える必要がない場合はGetを、複数の要素を対象とする場合はForEachForRange、範囲for文などを用いたほうが安全です。

注意

この関数で取得した戻り値に対し、++--、添字アクセス等を行わないでください。本クラスは範囲外アクセス等の未定義動作を防ぐ目的でも用意されているため、戻り値を通常の配列のように扱う事は想定されていません。また、将来に渡って常に要素が連続配置される保証もありません。

利用例#

// サイズ10のint型の配列を生成
MGL::Array<int> array(10);

// インデックス3の要素を取得し、成功したらその内容を76に書き換える。
if (auto *value = array.GetPtr(3); value != nullptr)
{
    *value = 76;
}

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


ForEach#

関数オブジェクトを用いた全ての要素へのアクセス

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        // (1) 非const版
        template <class LoopBody>
        constexpr void ForEach(LoopBody body) noexcept;

        // (2) const版
        template <class LoopBody>
        constexpr void ForEach(LoopBody body) const noexcept;
    };
}

引数#

LoopBody body

各々の要素にアクセスするための関数。詳細は説明を参照。

説明#

配列が保持する全ての要素に対し、関数オブジェクトを用いてアクセスを行うための関数です。指定した関数は要素ごとに、0から最大インデックスまで順に呼び出されます。

引数の関数オブジェクトに指定可能なフォーマットは次の通りです。

  1. 引数で要素の参照のみを受ける
    // サイズ5のint型の配列を生成
    MGL::Array<int> array(5);
    
    // array内の全ての要素に32を書き込み
    array.ForEach([](auto &value)
    {
        value = 32;
    });
    
    // array内の全ての要素をトレース表示
    array.ForEach([](const auto &value) // constを付けることで読み取り専用になる
    {
        MGL_TRACE("%d", value);
    });
    
    実行結果
    32
    32
    32
    32
    32
    
    補足

    この例のように参照のみを取得するForEach()の使用はあまり意味がなく、通常は次のような使用方法が推奨される。

    // サイズ5のint型の配列を生成
    MGL::Array<int> array(5);
    
    // array内の全ての要素に32を書き込み (Fill()を使用)
    array.Fill(32);
    
    // array内の全ての要素をトレース表示 (範囲for文を使用)
    for (const auto &value : array)
    {
        MGL_TRACE("%d", value);
    }
    
  2. 引数に要素の参照とインデックスを受ける
    // サイズ5のint型の配列を生成
    MGL::Array<int> array(5);
    
    // array内の全ての要素にインデックスの3倍の値を書き込む
    array.ForEach([](size_t index, auto &value)
    {
        value = static_cast<int>(index * 3);
    });
    
    // array内の全ての要素をインデックス付きでトレース表示
    array.ForEach([](size_t index, const auto &value)
    {
        MGL_TRACE("array[%zu] = %d", index, value);
    });
    
    実行結果
    array[0] = 0
    array[1] = 3
    array[2] = 6
    array[3] = 9
    array[4] = 12
    
  3. 戻り値について

    関数オブジェクトの戻り値をboolにしてfalseを返すことで、ループの中断が可能です。

    // サイズ5のint型の配列を生成
    MGL::Array<int> array(5);
    
    // インデックス3に-1を書き込む
    if (auto *value = array.GetPtr(3); value != nullptr)
    {
        *value = -1;
    }
    
    // 先頭から負の値が見つかるまでをトレース表示
    array.ForEach([](size_t index, const auto &value)
    {
        if (value < 0)
        {
            return false;
        }
    
        MGL_TRACE("array[%zu] = %d", index, value);
    
        return true;
    });
    
    実行結果
    array[0] = 0
    array[1] = 0
    array[2] = 0
    

    関数オブジェクトがvoid型(値を返さない)場合は常に継続となります。

利用例#

説明を参照してください。

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


ForRange#

関数オブジェクトを用いた指定範囲の要素へのアクセス

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        // (1) 非const版
        template <class LoopBody>
        constexpr void ForRange(
            IndexType begin,
            IndexType end,
            LoopBody body) noexcept;

        // (2) const版
        template <class LoopBody>
        constexpr void ForRange(
            IndexType begin,
            IndexType end,
            LoopBody body) const noexcept;
    };
}

引数#

IndexType begin

範囲の開始インデックス

IndexType end

範囲の終了インデックス

LoopBody body

各々の要素にアクセスするための関数。詳細は説明を参照。

説明#

配列が保持する一定範囲の要素に対し、関数オブジェクトを用いてアクセスを行うための関数です。

引数で指定したbeginからendまでのインデックスの要素を取得し、bodyに指定した関数オブジェクトに渡して呼び出します。インデックスが範囲外になる場合はbodyの関数の呼び出しを行いません。

bodyに指定可能な関数オブジェクトのフォーマットについてはForEachと同等ですので、詳細は該当関数の説明を参照してください。

呼び出し順はbeginからendに向かうように順に行われます。endにはbeginよりも小さいインデックスを指定することも可能で、その場合は逆順にbodyが呼び出されます。

利用例#

// サイズ5のint型の配列を生成
MGL::Array<int> array(5);

// インデックス1から3までの要素に32を書き込み
array.ForRange(1, 3, [](auto &value)
{
    value = 32;
});

// array内の全ての要素をインデックス付きでトレース表示
array.ForEach([](size_t index, const auto &value)
{
    MGL_TRACE("array[%zu] = %d", index, value);
});

// インデックス8から0までの要素をインデックス付きでトレース表示
// 範囲外のインデックスは無視されるため、8から5までは呼び出されない。
MGL_TRACE("---------------");
array.ForRange(8, 0, [](size_t index, const auto &value)
{
    MGL_TRACE("array[%zu] = %d", index, value);
});
実行結果
array[0] = 0
array[1] = 32
array[2] = 32
array[3] = 32
array[4] = 0
---------------
array[4] = 0
array[3] = 32
array[2] = 32
array[1] = 32
array[0] = 0

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


Contains#

指定した要素が範囲内に含まれているかを取得

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        // (1) 参照でチェック
        [[nodiscard]] constexpr bool Contains(const ValueType &element) const noexcept;

        // (2) ポインタでチェック
        [[nodiscard]] constexpr bool Contains(const ValueType *element) const noexcept
    };
}

引数#

(1) 参照でチェック
const ValueType &element

チェックする要素の参照

(2) ポインタでチェック
const ValueType *element

チェックする要素へのポインタ

戻り値#

bool

範囲内に含まれている場合はtrue、含まれていない場合はfalse

説明#

指定した要素が配列の範囲内に存在しているかをチェックします。

引数elementにはValueTypeの型の参照またはポインタを指定します。もしその要素が配列ないに存在している場合は戻り値にtrueを返します。

利用例#

// サイズ5のint型の配列を生成
MGL::Array<int> array(5);

// インデックス3の要素を取得してチェック
// 範囲内の有効な値が返るため、この結果はtrueになる。
const auto &value1 = array[3];
if (array.Contains(value1))
{
    MGL_TRACE("value1 は array内の要素。");
}
else
{
    MGL_TRACE("value1 は array内の要素ではない。");
}

// インデックス8の要素を取得してチェック
// 範囲外となり無効値が返るため、この結果はfalseになる。
const auto &value2 = array[8];
if (array.Contains(value2))
{
    MGL_TRACE("value2 は array内の要素。");
}
else
{
    MGL_TRACE("value2 は array内の要素ではない。");
}

// int型のローカル変数を生成してチェック
// 配列とは無関係な値であるため、この結果はfalseになる。
int value3 = 32;
if (array.Contains(value3))
{
    MGL_TRACE("value3 は array内の要素。");
}
else
{
    MGL_TRACE("value3 は array内の要素ではない。");
}
実行結果
value1 は array内の要素。
value2 は array内の要素ではない。
value3 は array内の要素ではない。

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


SetInvalidValue#

無効値の取得

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        // (1) 通常
        constexpr void SetInvalidValue(const ValueType &value) noexcept;

        // (2) 右辺値参照
        constexpr void SetInvalidValue(ValueType &&value) noexcept;
    };
}

引数#

(1) 通常
const ValueType &value

無効値として設定する値

(2) 右辺値参照
ValueType &&value

無効値として設定する値

説明#

Getで範囲外のインデックスを指定した際に、無効値として返す値を設定します。

引数を右辺値参照で指定した場合、無効値はコピーではなくムーブによって設定されます。コピーのコストが高い場合やコピー禁止のクラスを扱う場合などはstd::move()と併せてこちらを利用してください。

無効値はコンストラクタの引数で指定することも可能です。

利用例#

// サイズ5のint型の配列を生成
MGL::Array<int> array(5);

// 無効値に-1を設定
array.SetInvalidValue(-1);

// インデックス8の要素を取得して表示
// 範囲外なので無効値として設定した-1が返る
MGL_TRACE("array[8] = %d", array[8]);
実行結果
array[8] = -1;

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


GetSize#

サイズの取得

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        [[nodiscard]] constexpr size_t GetSize() const noexcept;
    };
}

戻り値#

size_t

配列のサイズ

説明#

初期化時に指定した配列のサイズを取得します。

配列は0からこの値が返す値-1までのインデックスにおいて有効な値を返します。

利用例#

// サイズ5のint型の配列を生成
MGL::Array<int> array(5);

// 配列のサイズを取得
MGL_TRACE("array size = %zu", array.GetSize());
実行結果
array size = 5

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


begin#

先頭の要素を指すポインタを取得

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        [[nodiscard]] constexpr ValueType *begin() const noexcept;
    };
}

戻り値#

配列の先頭の要素を指すポインタ

説明#

配列の先頭の要素を指すポインタを取得します。この関数は通常endと組み合わせて使用されます。

注意

この関数は範囲for文および一部の標準ライブラリの関数を利用する目的で実装されています。この関数をイテレータを取る標準ライブラリの引数以外に使用しないでください。

利用例#

// サイズ5のint型の配列を生成
MGL::Array<int> array(5);

// 範囲for文を用いて各要素に値を書き込み
// Note:
//  C++の範囲for文はbeginとendを用いたコードに置き換えられるため、
//  この関数が無ければ次のような範囲for文は使用できない。
int i = 3;
for (auto &value : array)
{
    value = i++;
}

// 標準ライブラリの std::find() を用いて配列内に5が含まれているかをチェック
// Note:
//  このようなイテレータを取る関数に利用する限りは問題無いが、
//  それ以外の用途においては推奨されない。
auto result = std::find(array.begin(), array.end(), 5);
if (result != array.end())
{
    MGL_TRACE("5を発見!");
}

// ❌非推奨な例
// Note:
//  このコードは現時点では問題なく動作するが、将来に渡ってbegin()がポインタを返すとは限らない。
//  (専用のイテレータに置き換わるかもしれない)
//  何より、生の配列を扱いたい場合、わざわざMGL::Arrayを用いる必要がない。
auto *top = array.begin();
for (size_t i = 0; i < array.GetSize(); i++)
{
    MGL_TRACE("%d", top[i]);
}

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


end#

末尾の次の要素を指すポインタを取得

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        [[nodiscard]] constexpr ValueType *end() const noexcept;
    };
}

戻り値#

配列の末尾の次の要素を指すポインタ

説明#

配列の末尾の次の要素を指すポインタを取得します。この関数は通常beginと組み合わせて使用されます。

注意

この関数は範囲for文および一部の標準ライブラリの関数を利用する目的で実装されています。この関数をイテレータを取る標準ライブラリの引数以外に使用しないでください。

利用例#

beginの利用例を参照してください。

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


operator=#

演算子によるムーブ

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        // (1) 演算子によるムーブ
        Array & operator=(Array &&rhs) noexcept;

        // (2) コピーを禁止するための宣言
        Array &operator=(Array &) = delete;
    };
}

引数#

Array &&rhs

ムーブ元の配列

戻り値#

Array &

ムーブ後の配列

説明#

=演算子によるムーブ、およびコピーを禁止するための宣言です。

=演算子の右辺が右辺値参照である場合、その内容を左辺値へとムーブします。右辺が右辺値参照ではない場合は禁止されているコピーとなるため、コンパイルエラーとなります。

利用例#

// サイズ5のint型の配列 array を生成
MGL::Array<int> array(5);

// array を array2 へとムーブ
// これによりarrayの内容はarray2へと移り、arrayは空の配列となる。
auto array2 = std::move(array);

// コピーは禁止されているため、次のような記述は不可能。
auto array3 = array2;   // コンパイルエラー!!

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#


operator[]#

添字による要素アクセス

宣言#

namespace MGL
{
    template <class ValueType, class IndexType = size_t>
    class Array
    {
        [[nodiscard]] constexpr const ValueType &operator[](IndexType index) const noexcept;
    };
}

引数#

IndexType index

要素へのインデックス

戻り値#

const ValueType &

インデックスに対応した要素。範囲外の場合は無効値。

説明#

要素を読み取り専用で取得します。添字に0から要素数-1までのインデックスを指定することで、その値に対応した要素の参照を返します。

この戻り値は読み取り専用であり、取得した要素を書き換えることはできません。値を書き換える必要がある場合はGetPtrForEachForRange、範囲for文のいずれかを使用してください。

範囲外のインデックスを渡した場合、コンストラクタまたはSetInvalidValueで設定した無効値を返します。無効値を明示的に設定していない場合、そのデフォルト値は初期化時に指定したMGL::Memory::ClearModeによって変化します。

戻り値が範囲内の要素であるかを調べる場合はContainsを使用してください。

この関数はGetと等価です。

利用例#

// サイズ10、無効値-1のint型の配列を生成
MGL::Array<int> array(10, -1);

// 配列の全ての要素を32で埋める
array.Fill(32);

// インデックス3の内容を表示
MGL_TRACE("array[3] = %d", array[3]);

// インデックス99(範囲外)の内容を表示
MGL_TRACE("array[99] = %d", array[99]);
実行結果
array[3] = 32
array[99] = -1

バージョン情報#

MGL 1.1.15
  • 初回リリース

関連#