Sha256: 9bb573ef34f278c1aa72c3ecee59f4a6d70ef83b9214df595095d86fc70ff718

Contents?: true

Size: 1.59 KB

Versions: 38

Compression:

Stored size: 1.59 KB

Contents

#include "rice/Data_Type.hpp"
#include "rice/Constructor.hpp"

#include <map>

using namespace Rice;

namespace
{

class Map
{
private:
  struct Ruby_Value_Compare
  {
    bool operator()(Object lhs, Object rhs) const
    {
      Object result = lhs.call("<", rhs);
      return result.test();
    }
  };

  typedef std::map<Object, Object, Ruby_Value_Compare> Value_Map;

public:
  Object bracket(Object k)
  {
    Value_Map::iterator it = map_.find(k);
    return it == map_.end() ? Object(Qnil) : it->second;
  }

  Object bracket_equals(Object k, Object v)
  {
    map_[k] = v;
    return Qnil;
  }

  Value_Map::iterator begin() { return map_.begin(); }
  Value_Map::iterator end() { return map_.end(); }

  typedef Value_Map::value_type value_type;
  typedef Value_Map::iterator iterator;

private:
  Value_Map map_;
};

Data_Type<Map> rb_cMap;

} // namespace

template<>
Object to_ruby<Map::value_type>(Map::value_type const & p)
{
  return protect(rb_assoc_new, p.first, p.second);
}

#include <iostream>
extern "C"
void Init_map(void)
{
  RUBY_TRY
  {
    Map::iterator (Map::*begin)() = &Map::begin;
    Map::iterator (Map::*end)() = &Map::end;
    Rice::Module rb_mStd = define_module("Std");

    // TODO: no delete method on the map, because I'm not sure how to
    // make delete work properly while iterating
    rb_cMap =
      define_class_under<Map>(rb_mStd, "Map")
      .define_constructor(Constructor<Map>())
      .define_method("[]", &Map::bracket)
      .define_method("[]=", &Map::bracket_equals)
      .define_iterator(begin, end)
      .include_module(rb_mEnumerable)
      ;
  }
  RUBY_CATCH
}

Version data entries

38 entries across 38 versions & 6 rubygems

Version Path
rice-3.0.0 sample/map/map.cpp
rice2-2.2.1 sample/map/map.cpp
rice2-2.2.0 sample/map/map.cpp
rice-2.2.0 sample/map/map.cpp
rice-2.1.3 sample/map/map.cpp
rice-2.1.2 sample/map/map.cpp
rice-2.1.1 sample/map/map.cpp
rice-2.1.0 sample/map/map.cpp
rice-2.0.0 sample/map/map.cpp
rice-1.7.0 sample/map/map.cpp
rice-1.6.3 sample/map/map.cpp
jameskilton-rice-1.2.0 sample/map/map.cpp
rice-1.6.2 sample/map/map.cpp
rice-1.6.1 sample/map/map.cpp
rice-1.6.0 sample/map/map.cpp
rice-1.6.0.pre sample/map/map.cpp
rice-1.5.3 sample/map/map.cpp
rice-1.5.2 sample/map/map.cpp
keyme-rice-1.5.1.keyme1 sample/map/map.cpp
keyme-rice-1.5.1.keyme sample/map/map.cpp