📄 cpptcl.h
字号:
ch_->register_method(name, boost::shared_ptr<details::object_cmd_base>( new details::method9<C, R, T1, T2, T3, T4, T5, T6, T7, T8, T9>(f)), p); return *this; }private: boost::shared_ptr<class_handler<C> > ch_;};} // namespace details// init type for defining class constructorstemplate <typename T1 = void, typename T2 = void, typename T3 = void, typename T4 = void, typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void, typename T9 = void>class init {};// no_init type and object - to define classes without constructorsnamespace details{ struct no_init_type {};} // namespace detailsextern details::no_init_type no_init;// interpreter wrapperclass interpreter{public: interpreter(); interpreter(Tcl_Interp *, bool owner = true); ~interpreter(); void make_safe(); Tcl_Interp * get() const { return interp_; } // free function definitions template <typename R> void def(std::string const &name, R (*f)(), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback0<R>(f)), p); } template <typename R, typename T1> void def(std::string const &name, R (*f)(T1), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback1<R, T1>(f)), p); } template <typename R, typename T1, typename T2> void def(std::string const &name, R (*f)(T1, T2), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback2<R, T1, T2>(f)), p); } template <typename R, typename T1, typename T2, typename T3> void def(std::string const &name, R (*f)(T1, T2, T3), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback3<R, T1, T2, T3>(f)), p); } template <typename R, typename T1, typename T2, typename T3, typename T4> void def(std::string const &name, R (*f)(T1, T2, T3, T4), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback4<R, T1, T2, T3, T4>(f)), p); } template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5> void def(std::string const &name, R (*f)(T1, T2, T3, T4, T5), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback5<R, T1, T2, T3, T4, T5>(f)), p); } template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> void def(std::string const &name, R (*f)(T1, T2, T3, T4, T5, T6), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback6<R, T1, T2, T3, T4, T5, T6>(f)), p); } template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> void def(std::string const &name, R (*f)(T1, T2, T3, T4, T5, T6, T7), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback7<R, T1, T2, T3, T4, T5, T6, T7>(f)), p); } template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> void def(std::string const &name, R (*f)(T1, T2, T3, T4, T5, T6, T7, T8), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback8<R, T1, T2, T3, T4, T5, T6, T7, T8>(f)), p); } template <typename R, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> void def(std::string const &name, R (*f)(T1, T2, T3, T4, T5, T6, T7, T8, T9), policies const &p = policies()) { add_function(name, boost::shared_ptr<details::callback_base>( new details::callback9<R, T1, T2, T3, T4, T5, T6, T7, T8, T9>(f)), p); } // class definitions template <class C> details::class_definer<C> class_(std::string const &name) { boost::shared_ptr<details::class_handler<C> > ch( new details::class_handler<C>()); add_class(name, ch); add_constructor(name, ch, boost::shared_ptr<details::callback_base>( new details::callback0<C*>(&details::construct< C, void, void, void, void, void, void, void, void, void>::doit))); return details::class_definer<C>(ch); } template <class C, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> details::class_definer<C> class_(std::string const &name, init<T1, T2, T3, T4, T5, T6, T7, T8, T9> const &, policies const &p = policies()) { typedef typename details::get_callback_type_for_construct< C, T1, T2, T3, T4, T5, T6, T7, T8, T9>::type callback_type; boost::shared_ptr<details::class_handler<C> > ch( new details::class_handler<C>()); add_class(name, ch); add_constructor(name, ch, boost::shared_ptr<details::callback_base>( new callback_type(&details::construct< C, T1, T2, T3, T4, T5, T6, T7, T8, T9>::doit)), p); return details::class_definer<C>(ch); } template <class C> details::class_definer<C> class_( std::string const &name, details::no_init_type const &) { boost::shared_ptr<details::class_handler<C> > ch( new details::class_handler<C>()); add_class(name, ch); return details::class_definer<C>(ch); } // free script evaluation details::result eval(std::string const &script); details::result eval(std::istream &s); details::result eval(object const &o); // the InputIterator should give object& or Tcl_Obj* when dereferenced template <class InputIterator> details::result eval(InputIterator first, InputIterator last); // create alias from the *this interpreter to the target interpreter void create_alias(std::string const &cmd, interpreter &targetInterp, std::string const &targetCmd); // register a package info (useful when defining packages) void pkg_provide(std::string const &name, std::string const &version); // helper for cleaning up callbacks in non-managed interpreters static void clear_definitions(Tcl_Interp *);private: // copy not supported interpreter(const interpreter &); void operator=(const interpreter &); void add_function(std::string const &name, boost::shared_ptr<details::callback_base> cb, policies const &p = policies()); void add_class(std::string const &name, boost::shared_ptr<details::class_handler_base> chb); void add_constructor(std::string const &name, boost::shared_ptr<details::class_handler_base> chb, boost::shared_ptr<details::callback_base> cb, policies const &p = policies()); Tcl_Interp *interp_; bool owner_;};// object wrapperclass object{public: // constructors object(); explicit object(bool b); object(char const *buf, size_t size); // byte array explicit object(double b); explicit object(int i); // list creation // the InputIterator should give object& or Tcl_Obj* when dereferenced template <class InputIterator> object(InputIterator first, InputIterator last) : interp_(0) { std::vector<Tcl_Obj*> v; fill_vector(v, first, last); obj_ = Tcl_NewListObj(static_cast<int>(v.size()), v.empty() ? NULL : &v[0]); Tcl_IncrRefCount(obj_); } explicit object(long i); explicit object(char const *s); // string construction explicit object(std::string const &s); // string construction explicit object(Tcl_Obj *o, bool shared = false); object(object const &other, bool shared = false); ~object(); // assignment object & assign(bool b); object & resize(size_t size); // byte array resize object & assign(char const *buf, size_t size); // byte array assignment object & assign(double d); object & assign(int i); // list assignment // the InputIterator should give Tcl_Obj* or object& when dereferenced template <class InputIterator> object & assign(InputIterator first, InputIterator last) { std::vector<Tcl_Obj*> v; fill_vector(v, first, last); Tcl_SetListObj(obj_, static_cast<int>(v.size()), v.empty() ? NULL : &v[0]); return *this; } object & assign(long l); object & assign(char const *s); // string assignment object & assign(std::string const &s); // string assignment object & assign(object const &o); object & assign(Tcl_Obj *o); object & operator=(bool b) { return assign(b); } object & operator=(double d) { return assign(d); } object & operator=(int i) { return assign(i); } object & operator=(long l) { return assign(l); } object & operator=(char const *s) { return assign(s); } object & operator=(std::string const &s) { return assign(s); } object & operator=(object const &o) { return assign(o); } object & swap(object &other); // (logically) non-modifying members template <typename T> T get(interpreter &i) const; char const * get() const; // string get char const * get(size_t &size) const; // byte array get size_t length(interpreter &i) const; // returns list length object at(interpreter &i, size_t index) const; Tcl_Obj * get_object() const { return obj_; } // modifying members object & append(interpreter &i, object const &o); object & append_list(interpreter &i, object const &o); // list replace // the InputIterator should give Tcl_Obj* or object& when dereferenced template <class InputIterator> object & replace(interpreter &i, size_t index, size_t count, InputIterator first, InputIterator last) { std::vector<Tcl_Obj*> v; fill_vector(v, first, last); int res = Tcl_ListObjReplace(i.get(), obj_, static_cast<int>(index), static_cast<int>(count), static_cast<int>(v.size()), v.empty() ? NULL : &v[0]); if (res != TCL_OK) { throw tcl_error(i.get()); } return *this; } object & replace(interpreter &i, size_t index, size_t count, object const &o); object & replace_list(interpreter &i, size_t index, size_t count, object const &o); // helper functions for piggy-backing interpreter info void set_interp(Tcl_Interp *interp); Tcl_Interp * get_interp() const; // helper function, also used from interpreter::eval template <class InputIterator> static void fill_vector(std::vector<Tcl_Obj*> &v, InputIterator first, InputIterator last) { for (; first != last; ++first) { object o(*first, true); v.push_back(o.obj_); } }private: // helper function used from copy constructors void init(Tcl_Obj *o, bool shared); Tcl_Obj *obj_; Tcl_Interp *interp_;};// available specializations for object::gettemplate <> bool object::get<bool>(interpreter &i) const;template <> double object::get<double>(interpreter &i) const;template <> int object::get<int>(interpreter &i) const;template <> long object::get<long>(interpreter &i) const;template <> char const * object::get<char const *>(interpreter &i) const;template <> std::string object::get<std::string>(interpreter &i) const;template <>std::vector<char> object::get<std::vector<char> >(interpreter &i) const;// the InputIterator should give object& or Tcl_Obj* when dereferencedtemplate <class InputIterator>details::result interpreter::eval(InputIterator first, InputIterator last){ std::vector<Tcl_Obj*> v; object::fill_vector(v, first, last); int cc = Tcl_EvalObjv(interp_, static_cast<int>(v.size()), v.empty() ? NULL : &v[0], 0); if (cc != TCL_OK) { throw tcl_error(interp_); } return details::result(interp_);}namespace details{// additional callback envelopes for variadic functions#include "details/callbacks_v.h"// additional method envelopes for variadic methods#include "details/methods_v.h"} // namespace details} // namespace Tcl// macro for defining loadable module entry point// - used for extending Tcl interpreter#define CPPTCL_MODULE(name, i) void name##_cpptcl_Init(Tcl::interpreter &i); \ extern "C" int name##_Init(Tcl_Interp *interp) \ { \ Tcl::interpreter i(interp, false); \ name##_cpptcl_Init(i); \ return TCL_OK; \ } \ void name##_cpptcl_Init(Tcl::interpreter &i)#endif // CPPTCL_INCLUDED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -