C++1z 未初期化メモリのアルゴリズムと、デストラクタ呼び出しの関数

C++標準ライブラリには、データ構造を実装する際に使用する未初期化メモリに対するアルゴリズム<memory>ヘッダで定義されています。

C++1zでは、厳しいパフォーマンス要求があるデータ構造を実装しやすくするためのアルゴリズムが、いくつか定義されます。これらは、std::vectorの内部実装や、EASTL、follyといったライブラリの実装で使われていたものです。

関数 説明
std::destroy_at()
std::destroy()
std::destroy_n()
指定された単一要素もしくは範囲の要素に対してデストラクタを呼び出す
(配置newした要素に対してよく使う)
std::uninitialized_move()
std::uninitialized_move_n()
未初期化メモリから要素をムーブ構築する
std::uninitialized_value_construct()
std::uninitialized_value_construct_n()
未初期化メモリから要素を値初期化で構築する
std::uninitialized_default_construct()
std::uninitialized_default_construct()
未初期化メモリから要素をデフォルト構築する

宣言

// <memory>
namespace std {
  template <class T>
  void destroy_at(T* location);

  template <class ExecutionPolicy, class ForwardIterator>
  void destroy(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
               ForwardIterator first, ForwardIterator last);

  template <class ForwardIterator>
  void destroy(ForwardIterator first, ForwardIterator last);

  template <class ExecutionPolicy, class ForwardIterator, class Size>
  ForwardIterator destroy_n(ExecutionPolicy&& exec,//see [algorithms.parallel.overloads]
                            ForwardIterator first, Size n);

  template <class ForwardIterator, class Size>
  ForwardIterator destroy_n(ForwardIterator first, Size n);

  template <class ExecutionPolicy, class InputIterator, class ForwardIterator>
  ForwardIterator uninitialized_move(ExecutionPolicy&& exec,//see [algorithms.parallel.overloads]
                                     InputIterator first, InputIterator last, ForwardIterator result);

  template <class InputIterator, class ForwardIterator>
  ForwardIterator uninitialized_move(InputIterator first, InputIterator last, ForwardIterator result);

  template <class ExecutionPolicy, class InputIterator, class Size, class ForwardIterator>
  pair<InputIterator,ForwardIterator> uninitialized_move_n(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                      InputIterator first, Size n, ForwardIterator result);

  template <class InputIterator, class Size, class ForwardIterator>
  pair<InputIterator,ForwardIterator> uninitialized_move_n(InputIterator first, Size n, ForwardIterator result);

  template <class ExecutionPolicy, class ForwardIterator>
  void uninitialized_value_construct(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                     ForwardIterator first, ForwardIterator last);
  template <class ForwardIterator>
  void uninitialized_value_construct(ForwardIterator first, ForwardIterator last);

  template <class ExecutionPolicy, class ForwardIterator, class Size>
  ForwardIterator uninitialized_value_construct_n(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                                  ForwardIterator first, Size n);

  template <class ForwardIterator, class Size>
  ForwardIterator uninitialized_value_construct_n(ForwardIterator first, Size n);

  template <class ExecutionPolicy, class ForwardIterator>
  void uninitialized_default_construct(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                       ForwardIterator first, ForwardIterator last);

  template <class ForwardIterator>
  void uninitialized_default_construct(ForwardIterator first, ForwardIterator last);

  template <class ExecutionPolicy, class ForwardIterator, class Size>
  ForwardIterator uninitialized_default_construct_n(ExecutionPolicy&& exec, //see [algorithms.parallel.overloads]
                                                   ForwardIterator first, Size n);

  template <class ForwardIterator, class Size>
  ForwardIterator uninitialized_default_construct_n(ForwardIterator first, Size n);
}

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。

ElixirでExcelデータを読み込むライブラリ

ElixirでExcelデータを読み込むライブラリはいくつかありますが、どれも自分の用途には微妙に適合しませんでした。インタフェースと戻り値のフォーマットはexcellentライブラリが好きだったのですが、Excel 2000のデータしか読み込めなかったので、xlsx_parserライブラリをラップしてexcellentライブラリライクに操作できるライブラリを書きました。

読み方は「エクセリオン」です。昔に同名のゲームがあったようですが、LとRが違います。s/excerion/excelion/ 。元ネタはゲームではなく小説の『黒の魔王』です。

xlsx_parserライブラリに、シート名のリストを取得する機能がなかったので、ライブラリの実装を調べてその機能を拡張しました。その機能はxlsx_parserライブラリにissueとして送ったらv0.0.8で取り込んでもらえました。

あとは、excellentライブラリと違う点として、読み込みを開始する行番号を指定できるようにしてあります。

ドキュメントはとりあえずソースコードに書いてありますが、余裕ができてきたらex_docで書きます。