18 #ifndef TCL_OBJ_BASE_H 19 #define TCL_OBJ_BASE_H 33 #define TCL_OBJ_DBG(x) 38 int TCL_obj_template_not_included();
39 int dummyXXX=TCL_obj_template_not_included();
52 void ensure_exists(T*& x)
53 {
if (x==NULL) x=
new T;}
58 #define declare(name, typename, tcl_name) \ 59 typename *name##_entry; \ 60 if (TCL_obj_properties().count(const_cast<char*>(tcl_name))==0) \ 61 throw error("%s does not exist!",tcl_name); \ 62 name##_entry=TCL_obj_properties()[tcl_name]->memberPtrCasted<typename>(); \ 64 throw error("Incorrect argument %s assigned to %s",tcl_name,#name); \ 65 typename& name=*name##_entry; 67 int TCL_proc(ClientData
cd, Tcl_Interp *
interp,
int argc, CONST84
char **argv);
68 int TCL_oproc(ClientData
cd, Tcl_Interp *
interp,
int argc,
69 Tcl_Obj *
const argv[]);
70 void TCL_delete(ClientData
cd);
72 inline void TCL_cmd_data_delete(ClientData
cd)
80 #if (TCL_MAJOR_VERSION<8) 81 #error TCL 8.x or greater supported. Please upgrade your TCL 87 #pragma omit pack ecolab::TCL_args 88 #pragma omit unpack ecolab::TCL_args 89 #pragma omit TCL_obj ecolab::TCL_args 97 TCLObjRef(): ref(Tcl_NewStringObj(
"",0)) {Tcl_IncrRefCount(ref);}
98 TCLObjRef(Tcl_Obj* x): ref(x) {Tcl_IncrRefCount(x);}
103 Tcl_IncrRefCount(ref);
106 Tcl_Obj*
get()
const {
return ref;}
142 std::vector<TCLObjRef> argv;
146 {m_count--;
return argv[nextArg++].get();}
154 TCL_args(): nextArg(1), m_count(0), argv(1), count(m_count) {}
155 TCL_args(
int a, Tcl_Obj *
const *v): nextArg(1), m_count(a), count(m_count)
158 for (
int i=0; i<a; ++i)
159 argv.push_back(v[i]);
168 r.pushObj(argv[i+nextArg].
get());
173 void pushObj(Tcl_Obj* obj) {argv.push_back(obj); m_count++;}
176 TCL_args& operator<<(
const std::string& x)
177 {pushObj(Tcl_NewStringObj(x.c_str(),-1));
return *
this;}
179 {pushObj(Tcl_NewStringObj(x,-1));
return *
this;}
180 TCL_args& operator<<(
bool x) {pushObj(Tcl_NewBooleanObj(x));
return *
this;}
181 TCL_args& operator<<(
int x) {pushObj(Tcl_NewIntObj(x));
return *
this;}
182 TCL_args& operator<<(
unsigned x) {pushObj(Tcl_NewIntObj(x));
return *
this;}
183 TCL_args& operator<<(
long x) {pushObj(Tcl_NewLongObj(x));
return *
this;}
184 TCL_args& operator<<(
double x) {pushObj(Tcl_NewDoubleObj(x));
return *
this;}
187 TCL_args& operator>>(std::string& x) {x=str();
return *
this;}
188 TCL_args& operator>>(
const char*& x) {x=str();
return *
this;}
191 if (Tcl_GetBooleanFromObj(
interp(),pop_arg(),&tmp)!=TCL_OK)
192 throw error(
"argument error");
197 if (Tcl_GetIntFromObj(
interp(),pop_arg(),&x)!=TCL_OK)
198 throw error(
"argument error");
203 if (Tcl_GetIntFromObj(
interp(),pop_arg(),&tmp)!=TCL_OK)
204 throw error(
"argument error");
206 else throw error(
"assigning %d to an unsigned variable",tmp);
210 if (Tcl_GetLongFromObj(
interp(),pop_arg(),&x)!=TCL_OK)
211 throw error(
"argument error");
215 if (Tcl_GetDoubleFromObj(
interp(),pop_arg(),&x)!=TCL_OK)
227 {
throw error(
"calling get on %s", typeName<T>().c_str());}
229 template <
class T>
operator T() {
return get<T>();}
233 template <>
inline TCL_args& operator>>(
TCL_args& a,
char*& x) {x=
const_cast<char*
>(a.str());
return a;}
234 template <>
inline TCL_args& operator>>(
TCL_args& a,
const char*& x) {x=a.str();
return a;}
244 s << (
char*)args[-1];
245 while (args.count) s << (
char*)args;
253 virtual void get() {
throw error(
"get() not implemented");}
254 virtual void put(
const char *s) {
throw error(
"put not implemented");}
255 void proc(
int argc, CONST84
char **argv)
257 if (argc>1) put(argv[1]);
259 if (hook) {hook(argc,argv);}
262 virtual void proc(
int argc, Tcl_Obj *
const argv[]) {
263 cmd_data::proc(argc,argv);
264 if (thook) thook(argc,argv);
268 void (*hook)(
int argc, CONST84
char **argv);
269 void (*thook)(
int argc, Tcl_Obj *
const argv[]);
275 bool operator()(
const std::type_info* x,
const std::type_info* y)
const {
276 return x->before(*y);
281 typedef std::map<const std::type_info*,void*,TypeInfoLess>
BasePtrs;
284 template <
class T> T* memberPtrCasted()
const;
287 #pragma omit pack ecolab::member_entry_base 288 #pragma omit unpack ecolab::member_entry_base 289 #pragma omit pack TCL_obj_member_entry::member_entry 290 #pragma omit unpack TCL_obj_member_entry::member_entry 291 #pragma omit pack ecolab::member_entry 292 #pragma omit unpack ecolab::member_entry 298 typedef std::map<string,classdesc::shared_ptr<member_entry_base> > TCL_obj_hash;
300 TCL_obj_hash& TCL_obj_properties();
303 inline void eraseAllNamesStartingWith(
const string& name)
305 for (TCL_obj_hash::iterator it=TCL_obj_properties().find(name);
306 it!=TCL_obj_properties().end() && it->first.find(name)!=string::npos;)
308 TCL_obj_hash::iterator toErase=it++;
309 TCL_obj_properties().erase(toErase);
333 typedef void (*Member_entry_hook)(
int argc, CONST84
char **argv);
335 typedef void (*Member_entry_thook)(
int argc, Tcl_Obj *
const argv[]);
339 void checkpoint(
int argc,
char *argv[]);
341 void restart(
int argc,
char *argv[]);
343 void get_vars(
int argc,
char *argv[]);
345 void data_server(
int argc,
char *argv[]);
346 TCL_obj_t(): xdr_check(false), member_entry_hook((Member_entry_hook)NULL),
347 member_entry_thook((Member_entry_thook)NULL){}
352 #pragma omit pack classdesc::TCL_obj_t 353 #pragma omit unpack classdesc::TCL_obj_t 378 access_TCL_obj<T>()(t,desc,arg);
392 using classdesc::string;
394 template <
class T>
void TCL_obj(
TCL_obj_t&,
const string&, T&);
395 template <
class T>
void TCL_obj_onbase(
TCL_obj_t&,
const string&, T&);
403 classdesc::string name;
405 if (this->nullref()) {
411 T* operator->() {
return &operator*();}
412 const T* operator->()
const {
return &operator*();}
416 ref& operator=(
const ref& x) {
418 eraseAllNamesStartingWith(name);
419 TCL_obj(null_TCL_obj,name,**
this);
422 template <
class U>
ref& operator=(
const U& x) {
424 eraseAllNamesStartingWith(name);
425 TCL_obj(null_TCL_obj,name,**
this);
430 eraseAllNamesStartingWith(name);
431 TCL_obj(null_TCL_obj,name,**
this);
432 eraseAllNamesStartingWith(x->name);
433 TCL_obj(null_TCL_obj,x->name,*x);
438 bool operator!=(
const U& x) {
return !operator==(x);}
456 TCL_obj_ref(
const char* nm): datum(NULL) {
set(nm);}
457 T* operator->() {
return datum;}
458 T& operator*() {
return *datum;}
459 const T* operator->()
const {assert(datum);
return datum;}
460 const T& operator*()
const {assert(datum);
return *datum;}
461 operator bool()
const {
return datum;}
463 void set(
const char *s);
469 #pragma omit pack ecolab::TCL_obj_ref 470 #pragma omit unpack ecolab::TCL_obj_ref 471 #pragma omit TCL_obj ecolab::TCL_obj_ref 472 #pragma omit TCL_obj classdesc::ref 473 #pragma omit TCL_obj ecolab::ref 476 template <
class T>
class ref;
484 template<
class T,
class CharT,
class Traits>
487 std::basic_istream<CharT,Traits>&>::T
488 operator>>(std::basic_istream<CharT,Traits>& x,T& y);
490 template<
class T,
class CharT,
class Traits>
492 operator>>(std::basic_istream<CharT,Traits>& x,T& y);
494 template<
class T,
class CharT,
class Traits>
496 operator>>(std::basic_istream<CharT,Traits>& x,T& y);
498 template<
class T,
class CharT,
class Traits>
500 operator>>(std::basic_istream<CharT,Traits>& x,T& y);
502 template<
class T,
class CharT,
class Traits>
504 operator>>(std::basic_istream<CharT,Traits>& x,T& y);
507 template<
class T,
class CharT,
class Traits>
508 inline std::basic_istream<CharT,Traits>&
509 operator>>(std::basic_istream<CharT,Traits>&,
ref<T>& y);
517 void put(
const char *s);
526 BasePtrs::const_iterator i=basePtrs.find(&
typeid(T));
527 if (i!=basePtrs.end())
528 return (T*)(i->second);
543 void put(
const char *s);
553 void get() {
tclreturn()<<string(*memberptr);}
554 void put(
const char *s) {
throw error(
"cannot change const attribute");}
565 void put(
const char *s) {
throw error(
"cannot change const attribute");}
575 void put(
const char *s) {memberptr->
set(s);
tclreturn() << s;}
585 void put(
const char *s)
588 throw error(
"missing reference to assign %s to",s);
591 if (TCL_obj_properties().count(s)==0)
592 throw error(
"%s does not exist!",s);
593 if (T *
object=TCL_obj_properties()[s]->memberPtrCasted<T>())
599 throw error(
"Incorrect argument type %s",s);
614 const void *memberptr;
630 if (TCL_obj_properties().count(s)==0)
631 throw error(
"%s does not exist!",s);
632 if (T*
object= TCL_obj_properties()[s]->memberPtrCasted<T>())
638 throw error(
"Incorrect argument type %s",s);
642 void TCL_obj_register(
const TCL_obj_t& targ,
const string& desc, T& arg,
645 TCL_obj_hash::iterator it=TCL_obj_properties().find(desc);
646 if (!base || it==TCL_obj_properties().end())
649 m->
hook=targ.member_entry_hook;
650 m->thook=targ.member_entry_thook;
652 TCL_OBJ_DBG(printf(
"registering %s, with entry %x\n",desc.c_str(),m));
654 Tcl_CreateCommand(
interp(),desc.c_str(),(Tcl_CmdProc*)TCL_proc,(ClientData)m,TCL_delete);
655 TCL_obj_properties()[desc].reset(m);
661 it->second->basePtrs[&
typeid(T)]=(
void*)&arg;
665 void TCL_obj_deregister(
const string& desc );
673 T &arg,
int dims,...);
678 TCL_obj(targ, desc, t);
682 template <
class T,
class U>
685 TCL_obj(targ, desc, u);
696 #pragma omit pack ecolab::TCL_obj_functor 697 #pragma omit unpack ecolab::TCL_obj_functor 698 #pragma omit TCL_obj ecolab::TCL_obj_functor 699 #pragma omit isa ecolab::TCL_obj_functor 701 template<
class C,
class T>
708 T (C::*mbr)(int,
char**);
713 void (*hook)(
int argc, CONST84
char **argv);
714 void (*thook)(
int argc, Tcl_Obj *
const argv[]);
717 void init(C& oo, T (C::*m) ()) {o=&oo; mbrvoid=m; c=memvoid;}
718 void init(C& oo, T (C::*m) (
int,
char**)) {o=&oo; mbr=m; c=mem;}
719 void init(C& oo, T (C::*m) (
TCL_args)) {o=&oo; mbrobj=m; c=mem;}
720 void init(C& oo, T (*f) (...)) {o=&oo; fptr=f; c=func;}
721 void init(C& oo, T (*f) (
const TCL_args&)) {o=&oo; ofptr=f; c=func;}
722 void proc(
int argc, CONST84
char **argv)
727 case memvoid: r<<(o->*mbrvoid)();
break;
728 case mem: r<<(o->*mbr)(argc,const_cast<char**>(argv));
break;
729 case func: r<<fptr(argc,const_cast<char**>(argv));
break;
730 case nonconst:
throw error(
"non const method called on const object");
733 if (hook) hook(argc, argv);
735 void proc(
int argc, Tcl_Obj *
const argv[])
740 case mem: r<<(o->*mbrobj)(
TCL_args(argc,argv));
break;
741 case func: r<<ofptr(
TCL_args(argc,argv));
break;
742 case nonconst:
throw error(
"non const method called on const object");
745 if (thook) thook(argc, argv);
749 template<
class C,
class T>
755 T (C::*mbrvoid) ()
const;
756 T (C::*mbr)(int,
char**)
const;
761 void (*hook)(
int argc, CONST84
char **argv);
762 void (*thook)(
int argc, Tcl_Obj *
const argv[]);
765 void init(
const C& oo, T (C::*m) ()
const) {o=&oo; mbrvoid=m; c=memvoid;}
766 void init(
const C& oo, T (C::*m) (
int,
char**)
const) {o=&oo; mbr=m; c=mem;}
767 void init(
const C& oo, T (C::*m) (
TCL_args)
const ) {o=&oo; mbrobj=m; c=mem;}
768 void init(
const C& oo, T (C::*m) ()) {o=&oo; c=nonconst;}
769 void init(
const C& oo, T (C::*m) (
int,
char**)) {o=&oo; c=nonconst;}
770 void init(
const C& oo, T (C::*m) (
TCL_args)) {o=&oo; c=nonconst;}
771 void init(
const C& oo, T (*f) (...)) {o=&oo; fptr=f; c=func;}
772 void init(
const C& oo, T (*f) (
const TCL_args&)) {o=&oo; ofptr=f; c=func;}
773 void proc(
int argc, CONST84
char **argv)
778 case memvoid: r<<(o->*mbrvoid)();
break;
779 case mem: r<<(o->*mbr)(argc,const_cast<char**>(argv));
break;
780 case func: r<<fptr(argc,const_cast<char**>(argv));
break;
782 if (hook) hook(argc, argv);
784 void proc(
int argc, Tcl_Obj *
const argv[])
789 case mem: r<<(o->*mbrobj)(
TCL_args(argc,argv));
break;
790 case func: r<<ofptr(
TCL_args(argc,argv));
break;
792 if (thook) thook(argc, argv);
804 void (C::*mbrvoid) ();
805 void (C::*mbr)(int,
char**);
810 void (*hook)(
int argc, CONST84
char **argv);
811 void (*thook)(
int argc, Tcl_Obj *
const argv[]);
814 void init(C& oo,
void (C::*m) ()) {o=&oo; mbrvoid=m; c=memvoid;}
815 void init(C& oo,
void (C::*m) (
int,
char**)) {o=&oo; mbr=m; c=mem;}
816 void init(C& oo,
void (C::*m) (
TCL_args)) {o=&oo; mbrobj=m; c=mem;}
817 void init(C& oo,
void (*f) (...)) {o=&oo; fptr=f; c=func;}
818 void init(C& oo,
void (*f) (
const TCL_args&)) {o=&oo; ofptr=f; c=func;}
819 void proc(
int argc, CONST84
char **argv)
823 case memvoid: (o->*mbrvoid)();
break;
824 case mem: (o->*mbr)(argc,const_cast<char**>(argv));
break;
825 case func: fptr(argc,const_cast<char**>(argv));
break;
828 if (hook) hook(argc, argv);
830 void proc(
int argc, Tcl_Obj *
const argv[])
834 case mem: (o->*mbrobj)(
TCL_args(argc,argv));
break;
835 case func: ofptr(
TCL_args(argc,argv));
break;
838 if (thook) thook(argc, argv);
845 template <
class C,
class M>
847 And<Or<Not<is_const<C> >, functional::is_const_method<M> >,
848 functional::AllArgs<functional::bound_method<C,M>, is_rvalue> > {};
851 #pragma omit pack ecolab::BoundMethodCallable 852 #pragma omit unpack ecolab::BoundMethodCallable 853 #pragma omit TCL_obj ecolab::BoundMethodCallable 854 #pragma omit isa ecolab::BoundMethodCallable 858 template <
class B,
class A>
861 newTCL_obj_functor_proc(B bm, A args,
dummy<0> x=0)
863 tclreturn() << functional::apply_nonvoid_fn(bm, args);
867 template <
class B,
class A>
870 newTCL_obj_functor_proc(B bm, A args,
dummy<1> x=0)
872 functional::apply_void_fn(bm, args);
876 template <
class B,
class A>
878 newTCL_obj_functor_proc(B bm, A args,
dummy<2> x=0)
880 throw error(
"cannot call %s",args[-1].str());
884 template <
class C,
class M>
888 TCL_obj_t::Member_entry_thook thook;
891 bm(obj, member), thook(targ.member_entry_thook) {
895 void proc(
int argc, Tcl_Obj *
const argv[]) {
896 newTCL_obj_functor_proc(bm,
TCL_args(argc, argv));
897 if (thook) thook(argc, argv);
899 void proc(
int,
const char **) {}
902 template<
class C,
class M>
907 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()));
908 Tcl_CreateObjCommand(
interp(),desc.c_str(),TCL_oproc,(ClientData)t,TCL_cmd_data_delete);
916 TCL_obj_t::Member_entry_thook thook;
919 f(f), thook(targ.member_entry_thook) {is_const=
true;}
920 void proc(
int argc, Tcl_Obj *
const argv[]) {
921 newTCL_obj_functor_proc(f,
TCL_args(argc, argv));
922 if (thook) thook(argc, argv);
924 void proc(
int,
const char **) {}
927 template<
class C,
class M>
929 TCL_obj(
TCL_obj_t& targ,
const string& desc, C& c, M m)
932 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()));
933 Tcl_CreateObjCommand(
interp(),desc.c_str(),TCL_oproc,(ClientData)t,TCL_cmd_data_delete);
941 template<
class C,
class T>
942 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj,
943 T (C::*arg)(
int,
const char**))
946 t->init(obj,arg); t->name=desc;
947 t->hook=targ.member_entry_hook; t->thook=targ.member_entry_thook;
948 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()););
949 Tcl_CreateCommand(
interp(),desc.c_str(),(Tcl_CmdProc*)TCL_proc,(ClientData)t,TCL_cmd_data_delete);
952 template<
class C,
class T>
953 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj,
954 T (C::*arg)(
int,
const char**)
const)
956 typedef T (C::*mptr)(int,
const char**);
957 TCL_obj(targ,desc,obj,(mptr)arg);
958 TCL_obj_properties()[desc]->is_const=
true;
961 template<
class C,
class T>
962 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj,
963 T (C::*arg)(
int,
char**))
966 t->init(obj,arg); t->name=desc;
967 t->hook=targ.member_entry_hook; t->thook=targ.member_entry_thook;
968 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()););
969 Tcl_CreateCommand(
interp(),desc.c_str(),(Tcl_CmdProc*)TCL_proc,(ClientData)t,TCL_cmd_data_delete);
972 template<
class C,
class T>
973 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj,
974 T (C::*arg)(
int,
char**)
const)
976 typedef T (C::*mptr)(int,
char**);
977 TCL_obj(targ,desc,obj,(mptr)arg);
978 TCL_obj_properties()[desc]->is_const=
true;
981 template<
class C,
class T>
982 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj, T (*arg)(
int argc,
const char**))
985 t->init(obj,arg); t->name=desc;
986 t->hook=targ.member_entry_hook; t->thook=targ.member_entry_thook;
987 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()););
988 Tcl_CreateObjCommand(
interp(),desc.c_str(),TCL_oproc,(ClientData)t,TCL_cmd_data_delete);
991 template<
class C,
class T>
992 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj, T (*arg)(
int argc,
char**))
995 t->init(obj,arg); t->name=desc;
996 t->hook=targ.member_entry_hook; t->thook=targ.member_entry_thook;
997 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()););
998 Tcl_CreateObjCommand(
interp(),desc.c_str(),TCL_oproc,(ClientData)t,TCL_cmd_data_delete);
1001 template<
class C,
class T>
1002 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj,
1006 t->init(obj,arg); t->name=desc;
1007 t->hook=targ.member_entry_hook; t->thook=targ.member_entry_thook;
1008 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()););
1009 Tcl_CreateObjCommand(
interp(),desc.c_str(),TCL_oproc,(ClientData)t,TCL_cmd_data_delete);
1012 template<
class C,
class T>
1013 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj,
1017 TCL_obj(targ,desc,obj,(mptr)arg);
1018 TCL_obj_properties()[desc]->is_const=
true;
1021 template<
class C,
class T>
1025 t->init(obj,arg); t->name=desc;
1026 t->hook=targ.member_entry_hook; t->thook=targ.member_entry_thook;
1027 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()););
1028 Tcl_CreateObjCommand(
interp(),desc.c_str(),TCL_oproc,(ClientData)t,TCL_cmd_data_delete);
1031 template<
class C,
class T>
1032 void TCL_obj(
TCL_obj_t& targ,
const string& desc, C& obj, T (*arg)(
const TCL_args&))
1035 t->init(obj,arg); t->name=desc;
1036 t->hook=targ.member_entry_hook; t->thook=targ.member_entry_thook;
1037 TCL_OBJ_DBG(printf(
"registering %s\n",desc.c_str()););
1038 Tcl_CreateObjCommand(
interp(),desc.c_str(),TCL_oproc,(ClientData)t,TCL_cmd_data_delete);
1042 #pragma omit TCL_obj string 1043 #pragma omit TCL_obj eco_strstream 1046 #pragma omit TCL_obj ostream 1047 #pragma omit TCL_obj ecolab::member_entry_base 1048 #pragma omit TCL_obj _ios_fields 1050 #pragma omit TCL_obj GRAPHCODE_NS::omap 1051 #pragma omit TCL_obj graphcode::GraphMaps 1052 #pragma omit TCL_obj graphcode::Graph 1053 #pragma omit TCL_obj ref 1058 {TCL_obj_register(t,d, a);}
1061 using ecolab::TCL_obj;
1062 using ecolab::TCL_obj_onbase;
1072 void operator()(
cd::TCL_obj_t& t,
const cd::string& d, U& a)
1084 void operator()(
cd::TCL_obj_t& t,
const cd::string& d, U& a)
1086 if (a) TCL_obj(t,d,*a);
1095 {TCL_obj_register(d, a, t.member_entry_hook, t.member_entry_thook);}
1108 void proc(
int argc, Tcl_Obj *
const argv[]) {
1115 void proc(
int,
const char **) {}
1124 void proc(
int argc, Tcl_Obj *
const argv[]) {
1127 void proc(
int,
const char **) {}
1137 template <
class T,
class G,
class S>
1143 TCL_OBJ_DBG(printf(
"registering %s\n",d.c_str()););
1144 Tcl_CreateObjCommand(
ecolab::interp(),d.c_str(),ecolab::TCL_oproc,
1146 ecolab::TCL_cmd_data_delete);
1152 #if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__) 1153 #pragma GCC diagnostic push 1154 #pragma GCC diagnostic ignored "-Wunused-local-typedefs" 1157 #include "TCL_obj_base.cd" 1159 #if defined(__GNUC__) && !defined(__ICC) && !defined(__clang__) 1160 #pragma GCC diagnostic pop Metaprogramming support for processing functions of multiple arguments.
Definition: TCL_obj_base.h:251
An RAII class for returning values to TCL.
Definition: tcl++.h:563
a slightly safer way of referring to registered objects than bare pointers
Definition: TCL_obj_base.h:449
bool xdr_check
whether to use xdr_pack or binary pack in checkpoint/restart
Definition: TCL_obj_base.h:331
whether B's method is callable due to the rules of const-correctness, or due to having lvalue argumen...
Definition: TCL_obj_base.h:843
unsigned myid
main window of application
is_const_method::value is true if F is a pointer to a const method
Definition: TCL_obj_base.h:40
Definition: TCL_obj_base.h:273
An EcoLab string stream class.
Definition: eco_strstream.h:64
EcoLab exception class.
Definition: error.h:25
Tcl_Interp * interp()
default interpreter. Set to NULL when interp() is destroyed
Definition: tcl++.h:222
T * memberPtrCasted() const
returns reference to base object of type T, if this is castable, null otherwise
Definition: TCL_obj_base.h:520
RAII TCL_Obj ref.
Definition: TCL_obj_base.h:93
T & operator*()
dereference - creates default object if null
Definition: TCL_obj_base.h:65
Reference counted smart pointer classes.
classdesc::TCL_obj_t null_TCL_obj
a null TCL_obj_t suitable for nothing if needed.
Definition: TCL_obj_base.h:627
Definition: TCL_obj_base.h:624
Definition: TCL_obj_base.h:330
Definition: TCL_obj_base.h:267
class to allow access to private members
Definition: classdesc_access.h:21
Definition: TCL_obj_base.h:632
void set(const char *s)
set object to refer to registered object s.
Definition: TCL_obj_base.h:629
Definition: TCL_obj_base.h:327
std::map< const std::type_info *, void *, TypeInfoLess > BasePtrs
map of pointers to base class objects of the referred object
Definition: TCL_obj_base.h:281
helper for constructing null descriptors
Definition: classdesc.h:784
Definition: TCL_obj_base.h:885
Definition: TCL_obj_base.h:511
virtual void proc(int argc, Tcl_Obj *const argv[])
just to stop some compiler warning
Definition: TCL_obj_base.h:262
class to allow access to private members
Definition: classdesc_access.h:22
void TCL_obj_custom_register(const string &desc, T &arg)
a 'hook' to allow registrations to occur for TCL_objects (overriding base classes) ...
Definition: TCL_obj_base.h:668
#define CLASSDESC_ACCESS(type)
add friend statements for each accessor function
Definition: classdesc_access.h:36
Definition: TCL_obj_base.h:589
controlled template specialisation: stolen from boost::enable_if.
Definition: TCL_obj_base.h:250
void pack(pack_t &targ, const string &desc, is_treenode dum, const T *const &arg)
serialise a tree (or DAG)
Definition: pack_graph.h:28
Represent arguments to TCL commands.
Definition: TCL_obj_base.h:138
Definition: classdesc.h:588
Definition: TCL_obj_base.h:315
Definition: TCL_obj_base.h:913
distinguish between maps and sets based on value_type of container
Definition: TCL_obj_base.h:1131
for accessors (overloaded getter/setters that pretend to be attributes)
Definition: TCL_obj_base.h:1104
Return::T (or ::type) is the return type of F
Definition: TCL_obj_base.h:33
serialisation for standard containers
Definition: TCL_obj_base.h:364
inheritance relationship descriptor
Contains definitions related to classdesc functionality.
Definition: arrays.h:2514
Definition: TCL_obj_base.h:124
void parallel(TCL_args args)
parallel declarator support for TCL_args
Definition: TCL_obj_base.h:238
controlled template specialisation: stolen from boost::enable_if.
Definition: classdesc.h:249
_OPENMP
Definition: accessor.h:16
TCL_obj descriptor object.
Definition: TCL_obj_base.h:327
Definition: TCL_obj_base.h:27
Definition: TCL_obj_base.h:70
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition: accessor.h:55
Definition: TCL_obj_base.h:631
Definition: TCL_obj_base.h:702
Definition: accessor.h:32
void unpack(unpack_t &targ, const string &desc, is_treenode dum, T *&arg)
unserialise a tree.
Definition: pack_graph.h:44
void(* hook)(int argc, CONST84 char **argv)
Definition: TCL_obj_base.h:268