00001
00002
00003 #include "cppscript"
00004 #include "dynamic/extensions.hpp"
00005 #include "wrap_cpp_container.hpp"
00006
00007 #include <map>
00008
00009 static_call( register_pickle_type( cmp_map, map() ) );
00010
00011 using internal::nonroot_var;
00012
00013
00014 namespace
00015 {
00016 typedef nonroot_var value_type;
00017
00018 struct comparator
00019 {
00020 bool operator()(const nonroot_var & a, const nonroot_var & b) const
00021 {
00022 return a.ref().impl().compare(b.ref()) == cmp_lt;
00023 }
00024 };
00025
00026 struct map_traits
00027 {
00028 typedef std::pair<nonroot_var const, nonroot_var> value_type;
00029
00030 typedef std::map<nonroot_var, nonroot_var, comparator, dynamic::allocator<value_type> > container;
00031
00032 static var key(value_type & i)
00033 {
00034 return i.first.get();
00035 }
00036
00037 static var deref(value_type & i)
00038 {
00039 return i.first.get();
00040 }
00041
00042 static nonroot_var key(const var & v)
00043 {
00044 return v;
00045 }
00046
00047 static var value(value_type & i)
00048 {
00049 return i.second.get();
00050 }
00051
00052 static void mark_reachable(value_type & i, gc::garbage_collector & gc)
00053 {
00054 i.first.ref().impl().mark_reachable(gc);
00055 i.second.ref().impl().mark_reachable(gc);
00056 }
00057
00058 static const var_cmp_index comparison_index = cmp_map;
00059
00060 static const char * class_name()
00061 {
00062 return "map";
00063 }
00064
00065 static const char * iterator_class_name()
00066 {
00067 return "map::iterator";
00068 }
00069 };
00070 }
00071
00072 namespace dynamic
00073 {
00074 namespace types
00075 {
00077
00078 typedef dynamic::internal::wrap_assoc_container<map_traits> map_impl;
00079 }
00080 }
00081
00082
00083 var dynamic::map()
00084 {
00085 return new types::map_impl();
00086 }
00087
00088
00089 var dynamic::map(const var &k, const var & v)
00090 {
00091 return map()(k,v);
00092 }