Scopira  20080306
core/register.h
1 
2 /*
3  * Copyright (c) 2004 National Research Council
4  *
5  * All rights reserved.
6  *
7  * This material is confidential and proprietary information of
8  * National Research Council Canada ("Confidential Information").
9  * This Confidential Information may only be used and reproduced
10  * in accordance with the terms of the license agreement.
11  *
12  */
13 
14 #ifndef __INCLUDED_SCOPIRA_CORE_REGISTER_H__
15 #define __INCLUDED_SCOPIRA_CORE_REGISTER_H__
16 
17 #include <scopira/tool/objflowloader.h>
18 
19 namespace scopira
20 {
21  namespace core
22  {
36  enum
37  {
38  vg_primary = 0x0001, // not used, but i might sometime
39  vg_noui_c = 0x0002, // doesnt actually have a UI component (and doesnt decent from coreui::widget, etc)
40  vg_windowui_c = 0x0004, // has a gui, and always wants to be in its own window (having this and vg_noui_c)
41 
42  vg_needs_project_c = 0x0100, // a view that requires the model to have a project and be clicked from the project tree manager
43  vg_needs_copyfunc_c = 0x0200, // a view that requires the model have a registered copy ctor/func
44 
45  vg_show_c = 0x00FF, // lower 16 are shown by default
46  vg_hide_c = 0xFF00, // default that are hidden (just to be complete)
47  };
48 
49  // another mapping of the above
50  enum
51  {
52  no_uimode_c = vg_noui_c,
53  default_uimode_c = 0,
54  windowonly_uimode_c = vg_windowui_c,
55  };
56 
61 
62  typedef scopira::tool::object* (*copyfunc_t)(const scopira::tool::object*);
63  template <class T> scopira::tool::object* objcopyfunc_g(const scopira::tool::object *srco) { return new T(*dynamic_cast<const T*>(srco)); }
64 
65  class mi_set;
66 
67  template <class T> class register_flow;
68  template <class T> class register_object;
69  template <class T> class register_model;
70  template <class T> class register_view;
71  //class register_task;
72 
74  SCOPIRA_EXPORT void flow_reg_imp(const std::type_info& id, const char * name, scopira::tool::objflowloader::loadfunc_t loader);
76  SCOPIRA_EXPORT void link_object_parent_imp(const std::type_info &id, const char *parent_name);
78  SCOPIRA_EXPORT void link_object_parent_imp(const std::type_info &id, const char **parents);
80  SCOPIRA_EXPORT void link_object_copyfunc(const std::type_info &id, copyfunc_t cf);
82  SCOPIRA_EXPORT void link_model_imp(const std::type_info &id, bool linktomodeltype);
84  SCOPIRA_EXPORT void link_view_imp(const std::type_info &id, const char *model_type, const char *menu_name, int vgmask);
85  class objecttype;
88 
90  extern SCOPIRA_EXPORT const char *object_type_c;
92  extern SCOPIRA_EXPORT const char *model_type_c;
94  extern SCOPIRA_EXPORT const char *project_type_c;
96  extern SCOPIRA_EXPORT const char *view_type_c;
97  }
98 }
99 
100 // Lots of C-array stuff for efficincy when making static objects
101 // all resolves to std::strings for storage, though
102 
110 {
111  public:
112  const char * pm_parents[4];
113 
114  public:
115  // ctors
116 
117  mi_set(const char *parent0)
118  { pm_parents[0] = parent0; pm_parents[1] = 0; }
119  mi_set(const char *parent0, const char *parent1)
120  { pm_parents[0] = parent0; pm_parents[1] = parent1; pm_parents[2] = 0; }
121  mi_set(const char *parent0, const char *parent1, const char *parent2)
122  { pm_parents[0] = parent0; pm_parents[1] = parent1; pm_parents[2] = parent2; pm_parents[3] = 0; }
123 };
124 
132 template <class T>
134 {
135  public:
137  register_flow(const char *fullname) {
138  scopira::core::flow_reg_imp(typeid(T), (fullname), scopira::tool::objloadfunc_g<T>);
139  }
141  register_flow(const char *fullname, int dummy) {
142  scopira::core::flow_reg_imp(typeid(T), (fullname), 0);
143  }
144 };
145 
151 template <class T>
153 {
154  private:
155  typedef scopira::core::register_flow<T> parent_type;
156  public:
158  register_object(const char *fullname, const char *parent_name = 0)
159  : parent_type(fullname)
160  { link_object_parent_imp(typeid(T), parent_name); }
162  register_object(const char *fullname, mi_set s)
163  : parent_type(fullname)
164  { link_object_parent_imp(typeid(T), s.pm_parents); }
167  register_object(const char *fullname, const char *parent_name, int dummy)
168  : parent_type(fullname, dummy)
169  { link_object_parent_imp(typeid(T), parent_name); }
170 
171  // a pure conat char ** one can be made too, if need be
172 };
173 
184 template <class T>
186 {
187  private:
189  public:
191  register_model(const char *fullname, const char *parent_name = 0)
192  : parent_type(fullname)
193  { link_model_imp(typeid(T), !parent_name); link_object_parent_imp(typeid(T), parent_name); }
195  register_model(const char *fullname, const char *parent_name, copyable_model_type dummyinstance)
196  : parent_type(fullname)
197  { link_model_imp(typeid(T), !parent_name); link_object_parent_imp(typeid(T), parent_name);
198  link_object_copyfunc(typeid(T), objcopyfunc_g<T>); }
200  register_model(const char *fullname, mi_set s)
201  : parent_type(fullname)
202  { link_model_imp(typeid(T), false); link_object_parent_imp(typeid(T), s.pm_parents); }
204  register_model(const char *fullname, const char *parent_name, interface_model_type dummyinstance)
205  : parent_type(fullname, 1)
206  { link_model_imp(typeid(T), !parent_name); link_object_parent_imp(typeid(T), parent_name); }
207 
208  // a pure const char ** one can be made too, if need be
209 };
210 
221 template <class T>
223 {
224  private:
226  public:
228 
239  register_view(const char *fullname, const char *model_type, const char *menu_name, int vgmask = default_uimode_c)
240  : parent_type(fullname)
241  { link_view_imp(typeid(T), model_type, menu_name, vgmask); }
242 };
243 
278 #endif
279 
register_model(const char *fullname, const char *parent_name, copyable_model_type dummyinstance)
ctor, null parent_name means "model_i", this version is for stuff with cpy ctors
Definition: core/register.h:195
Definition: objecttype.h:38
register_model(const char *fullname, const char *parent_name, interface_model_type dummyinstance)
ctor, null parent_name means "model_i", interface version (ie. no loader)
Definition: core/register.h:204
void link_model_imp(const std::type_info &id, bool linktomodeltype)
internal functions
register_object(const char *fullname, const char *parent_name=0)
ctor, null parent_name means "top level object" (ie from tool::object)
Definition: core/register.h:158
register_flow(const char *fullname, int dummy)
version that has a NULL loader
Definition: core/register.h:141
Definition: core/register.h:69
Definition: archiveflow.h:20
register_model(const char *fullname, mi_set s)
ctor
Definition: core/register.h:200
register_model(const char *fullname, const char *parent_name=0)
ctor, null parent_name means "model_i"
Definition: core/register.h:191
Definition: core/register.h:109
register_object(const char *fullname, const char *parent_name, int dummy)
Definition: core/register.h:167
Definition: object.h:71
void link_object_parent_imp(const std::type_info &id, const char *parent_name)
internal functions
a class type for models that are just interfaces
Definition: core/register.h:58
void link_view_imp(const std::type_info &id, const char *model_type, const char *menu_name, int vgmask)
internal functions
register_object(const char *fullname, mi_set s)
ctor
Definition: core/register.h:162
void build_objecttype_tree(scopira::tool::count_ptr< scopira::core::objecttype > &out)
internal functions
const char * model_type_c
common type string: base of all models
const char * project_type_c
common type string: base of all project-enabled models
const char * view_type_c
common type string: base of all views
void link_object_copyfunc(const std::type_info &id, copyfunc_t cf)
internal functions
Definition: core/register.h:67
object *(* loadfunc_t)(void)
a loader function type
Definition: objflowloader.h:67
a class type for models that are copyable
Definition: core/register.h:60
const char * object_type_c
common type string: base of everything
register_flow(const char *fullname)
ctor, yes, just plain char *
Definition: core/register.h:137
Definition: core/register.h:68
void flow_reg_imp(const std::type_info &id, const char *name, scopira::tool::objflowloader::loadfunc_t loader)
internal functions
register_view(const char *fullname, const char *model_type, const char *menu_name, int vgmask=default_uimode_c)
ctor, null parent_name means "top level object" (ie from tool::object)
Definition: core/register.h:239
Definition: core/register.h:70