読者です 読者をやめる 読者になる 読者になる

Boost.MultiIndex ordered_index/hashed_indexにat()メンバ関数を追加するパッチ

C++

を書きました。


【例】

#include <string>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/member.hpp>

struct id_name {
  int id;
  std::string name;

  id_name(int id, const std::string& name)
    : id(id), name(name) {}
};

using namespace boost::multi_index;

typedef
    multi_index_container<
        id_name,
        indexed_by<
            ordered_unique<member<id_name, int, &id_name::id> >
        >
    >
container;

int main()
{
    container c;
    c.insert(id_name(3, "a"));
    c.insert(id_name(1, "b"));
    c.insert(id_name(4, "c"));

    assert(c.at(1).name == "b");

    try {
        c.at(99);
    }
    catch (std::out_of_range&) {
    }
}


【提案】
std::map/boost::unordered_mapと異なり、ordered_index/hashed_indexにはoperator()とat()メンバ関数が用意されていないため、要素を参照するためにfind()メンバ関数を使用するしかなく、これは不便であった。
そこで、ordered_index/hashed_indexへat()メンバ関数を追加するパッチを作成した。
operator
()については、random_accessとの競合を防ぐために作成していない。


MultiIndexの設計に従い、at()メンバ関数はconst版のみを作成し、破壊的な変更を許可する非const版は用意していない。
また、例外ではなくboost::optionalでエラー処理を行うoptional_at()メンバ関数も必要と考えるが、MultiIndexの設計上、Boost.Optionalでのエラーポリシーが規定されていないため、この提案には含めない。


TODO : あとで英文に訳す。



【Ordered indices/Hashed indices】

template<implementation defined: dependent on types Value, Allocator, 
 TagList, KeyFromValue, Compare> 
class name is implementation defined
{
public:
  ...

  // set operations:

  template<typename CompatibleKey> 
  typename std::iterator_traits<iterator>::value_type const& 
    at(const CompatibleKey& x)const;

  ...
};


【説明】
Requires: CompatibleKey is compatible key of key_compare
Effects: Returns a reference to an element whose key is equivalent to x.
Throws: An exception object of type out_of_range if no such element is present.
Complexity: O(log(n)).



【ソース】

boost/multi_index/hashed_index.hpp

boost/multi_index/ordered_index.hpp



【パッチ】

hashed_index.patch

ordered_index.patch



【テスト】

test_at.cpp