Make "clone" a chaiscript based operation instead of forcing the user to register a clone method.

This commit is contained in:
Jason Turner
2009-07-24 13:17:00 +00:00
parent 0d3c90a245
commit 0b789004e9
3 changed files with 7 additions and 10 deletions

View File

@@ -422,20 +422,17 @@ namespace chaiscript
}
/**
* Add a copy constructor for type T, also creates the standard
* function "clone" for the type. "clone" is a synonym for
* the copy constructor.
* Add a copy constructor for type T
*/
template<typename T>
ModulePtr copy_constructor(const std::string &type, ModulePtr m = ModulePtr(new Module()))
{
m->add(constructor<T (const T &)>(), type);
m->add(constructor<T (const T &)>(), "clone");
return m;
}
/**
* Add default and copy constructors (including "clone") for type T
* Add default and copy constructors for type T
*/
template<typename T>
ModulePtr basic_constructors(const std::string &type, ModulePtr m = ModulePtr(new Module()))

View File

@@ -121,6 +121,9 @@ namespace chaiscript
m->add(user_type<Retro<Bidir_Range<ContainerType> > >(), type + "_Retro_Range");
m->add(user_type<typename ContainerType::iterator>(), type+"_Iterator");
copy_constructor<Bidir_Range<ContainerType> >(type + "_Range", m);
copy_constructor<Retro<Bidir_Range<ContainerType> > >(type + "_Retro_Range", m);
m->add(constructor<Bidir_Range<ContainerType> (ContainerType &)>(), "range");
m->add(constructor<Bidir_Range<ContainerType> (typename ContainerType::iterator)>(), "range");
@@ -145,8 +148,6 @@ namespace chaiscript
m->add(constructor<Retro<Bidir_Range<ContainerType> > (const Bidir_Range<ContainerType> &)>(), "retro");
m->add(constructor<Bidir_Range<ContainerType> (const Bidir_Range<ContainerType> &)>(), "clone");
m->add(constructor<Retro<Bidir_Range<ContainerType> > (const Retro<Bidir_Range<ContainerType> > &)>(), "clone");
return m;
}
@@ -358,9 +359,7 @@ namespace chaiscript
m->add(fun(&PairType::first), "first");
m->add(fun(&PairType::second), "second");
m->add(constructor<PairType ()>(), type);
m->add(constructor<PairType (const PairType &)>(), type);
m->add(constructor<PairType (const PairType &)>(), "clone");
basic_constructors<PairType>(type, m);
m->add(constructor<PairType (const typename PairType::first_type &, const typename PairType::second_type &)>(), type);
return m;

View File

@@ -13,6 +13,7 @@
#define chaiscript_prelude CODE_STRING(\
def new(x) { eval(type_name(x))(); } \
def clone(x) { eval(type_name(x))(x); } \
# to_string for Pair()\n\
def to_string(x) : call_exists(first, x) && call_exists(second, x) { \
"<" + x.first.to_string() + ", " + x.second.to_string() + ">"; \