Go to the documentation of this file.00001 #include <ruby.h>
00002 #include <set>
00003
00004 static VALUE mUtilrb;
00005
00006 using namespace std;
00007
00008 #ifndef RUBINIUS
00009 static VALUE enumerable_each_uniq_i(VALUE i, VALUE* memo)
00010 {
00011 set<VALUE>& seen = *reinterpret_cast< set<VALUE>* >(memo);
00012 if (seen.find(i) == seen.end())
00013 {
00014 seen.insert(i);
00015 return rb_yield(i);
00016 }
00017 else
00018 return Qnil;
00019
00020 }
00021
00022
00023 static VALUE enumerable_each_uniq(VALUE self)
00024 {
00025 set<VALUE> seen;
00026 rb_iterate(rb_each, self,
00027 RUBY_METHOD_FUNC(enumerable_each_uniq_i), (VALUE)&seen);
00028 return self;
00029 }
00030
00031
00032
00033
00034
00035
00036 static VALUE kernel_is_singleton_p(VALUE self)
00037 {
00038 if (BUILTIN_TYPE(self) == T_CLASS && FL_TEST(self, FL_SINGLETON))
00039 return Qtrue;
00040 else
00041 return Qfalse;
00042 }
00043
00044 static VALUE kernel_is_immediate(VALUE klass, VALUE object)
00045 { return IMMEDIATE_P(object) ? Qtrue : Qfalse; }
00046 #endif
00047
00048 static VALUE kernel_crash(VALUE klass)
00049 {
00050 *((int*)0) = 10;
00051
00052 return Qfalse;
00053 }
00054
00055 extern "C" void Init_value_set();
00056 extern "C" void Init_weakref(VALUE mUtilrb);
00057 extern "C" void Init_proc();
00058 extern "C" void Init_utilrb_readline();
00059
00060 extern "C" void Init_utilrb()
00061 {
00062 mUtilrb = rb_define_module("Utilrb");
00063
00064 #ifndef RUBINIUS
00065 rb_define_method(rb_mEnumerable, "each_uniq", RUBY_METHOD_FUNC(enumerable_each_uniq), 0);
00066 if (!rb_respond_to(rb_mEnumerable, rb_intern("singleton_class?")))
00067 rb_define_method(rb_cModule, "singleton_class?", RUBY_METHOD_FUNC(kernel_is_singleton_p), 0);
00068
00069 rb_define_singleton_method(rb_mKernel, "crash!", RUBY_METHOD_FUNC(kernel_crash), 0);
00070 rb_define_singleton_method(rb_mKernel, "immediate?", RUBY_METHOD_FUNC(kernel_is_immediate), 1);
00071
00072 Init_weakref(mUtilrb);
00073 #endif
00074
00075 Init_proc();
00076
00077 Init_value_set();
00078 Init_utilrb_readline();
00079 }
00080