007: max_size()

今回より、コンテナのサイズを変更する処理の実装に入っていきます。
まずはその準備として、max_size() を定義します。
コンテナのサイズを上限よりも大きくしようとすると、std::length_error 例外が投げられます。その上限を示すのが、max_size() です。
template <typename T>
class myvector
{
...

private:
    enum : size_type {
        MAX_SIZE_BYTES = std::numeric_limits<size_type>::max(),
        MAX_SIZE = MAX_SIZE_BYTES / sizeof(value_type),
    };

public:
...

    /**
     * @brief      Returns the maximum number of elements the container is able to
     *             hold due to system or library implementation limitations, i.e.
     *             std::distance(begin(), end()) for the largest container.
     * @return     Maximum number of elements.
     */
    size_type max_size(void) const noexcept
    {
        return MAX_SIZE;
    }

...
};
enumハックを使った、少し凝った定義にしてみました。
まず、MAX_SIZE_BYTES で領域確保する最大バイト数を定義します。ここでは size_t の最大値となっています。
次に、MAX_SIZE で要素数を何個保持できるかを定義します。
max_size() 関数の中身は、MAX_SIZE を返すのみです。max_size() の戻り値を constexpr化することは可能ですが、標準ではそのようになっていないので、ここでも constexpr化は見送りました。




全ソースコード: https://github.com/suomesta/myvector/tree/master/007

0 件のコメント:

コメントを投稿