diff options
author | Mark Tiefenbruck <mark@fluxbox.org> | 2008-01-11 07:41:22 (GMT) |
---|---|---|
committer | Mark Tiefenbruck <mark@fluxbox.org> | 2008-01-11 07:41:22 (GMT) |
commit | 9f2f65a698c4cc71373a7fe9d73a0889e0d3487b (patch) | |
tree | 4ad67db771d73ea3c48f80a1244037fc9754edd2 /src/FbTk/ObjectRegistry.hh | |
parent | 1f01d84c080d607a91eb417efcaf5e500b5f1d7e (diff) | |
download | fluxbox_pavel-9f2f65a698c4cc71373a7fe9d73a0889e0d3487b.zip fluxbox_pavel-9f2f65a698c4cc71373a7fe9d73a0889e0d3487b.tar.bz2 |
make FbTk::Command a template class, split parsing information out of ObjectRegistry
Diffstat (limited to 'src/FbTk/ObjectRegistry.hh')
-rw-r--r-- | src/FbTk/ObjectRegistry.hh | 114 |
1 files changed, 10 insertions, 104 deletions
diff --git a/src/FbTk/ObjectRegistry.hh b/src/FbTk/ObjectRegistry.hh index d6a97d9..e68d630 100644 --- a/src/FbTk/ObjectRegistry.hh +++ b/src/FbTk/ObjectRegistry.hh | |||
@@ -22,124 +22,30 @@ | |||
22 | #ifndef OBJECTREGISTRY_HH | 22 | #ifndef OBJECTREGISTRY_HH |
23 | #define OBJECTREGISTRY_HH | 23 | #define OBJECTREGISTRY_HH |
24 | 24 | ||
25 | #include "StringUtil.hh" | ||
26 | |||
27 | #include <map> | 25 | #include <map> |
28 | 26 | #include <string> | |
29 | using std::string; | ||
30 | 27 | ||
31 | namespace FbTk { | 28 | namespace FbTk { |
32 | 29 | ||
33 | #define REGISTER_OBJECT_PARSER(name, parser, type) \ | 30 | template <typename Creator> |
34 | namespace { \ | ||
35 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<type>::instance().registerObject(#name, parser); \ | ||
36 | } | ||
37 | |||
38 | #define REGISTER_OBJECT_PARSER_NSBASE(name, parser, space, base) \ | ||
39 | namespace { \ | ||
40 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<space::base >::instance().registerObject(#name, parser); \ | ||
41 | } | ||
42 | |||
43 | /* Include some basic Object creators */ | ||
44 | template <typename Derived, typename Base> | ||
45 | Base *ObjectCreator(const string &name, const string &args, bool trusted) { | ||
46 | return new Derived(); | ||
47 | } | ||
48 | |||
49 | #define REGISTER_OBJECT(name, derived, base) \ | ||
50 | namespace { \ | ||
51 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<base >::instance().registerObject(#name, FbTk::ObjectCreator<derived, base >); \ | ||
52 | } | ||
53 | |||
54 | #define REGISTER_OBJECT_NSBASE(name, derived, space, base) \ | ||
55 | namespace { \ | ||
56 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<space::base >::instance().registerObject(#name, FbTk::ObjectCreator<derived, space::base >); \ | ||
57 | } | ||
58 | |||
59 | template <typename Derived, typename Base> | ||
60 | Base *ObjectCreatorWithArgs(const string &name, const string &args, | ||
61 | bool trusted) { | ||
62 | return new Derived(args); | ||
63 | } | ||
64 | |||
65 | #define REGISTER_OBJECT_WITH_ARGS(name, derived, base) \ | ||
66 | namespace { \ | ||
67 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<base >::instance().registerObject(#name, FbTk::ObjectCreatorWithArgs<derived, base >); \ | ||
68 | } | ||
69 | |||
70 | #define REGISTER_OBJECT_WITH_ARGS_NSBASE(name, derived, space, base) \ | ||
71 | namespace { \ | ||
72 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<space::base >::instance().registerObject(#name, FbTk::ObjectCreatorWithArgs<derived, space::base >); \ | ||
73 | } | ||
74 | |||
75 | template <typename Derived, typename Base> | ||
76 | Base *UntrustedObjectCreator(const string &name, const string &args, | ||
77 | bool trusted) { | ||
78 | if (!trusted) return 0; | ||
79 | return new Derived(); | ||
80 | } | ||
81 | |||
82 | #define REGISTER_UNTRUSTED_OBJECT(name, derived, base) \ | ||
83 | namespace { \ | ||
84 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<base >::instance().registerObject(#name, FbTk::UntrustedObjectCreator<derived, base >); \ | ||
85 | } | ||
86 | |||
87 | #define REGISTER_UNTRUSTED_OBJECT_NSBASE(name, derived, space, base) \ | ||
88 | namespace { \ | ||
89 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<space::base >::instance().registerObject(#name, FbTk::UntrustedObjectCreator<derived, space::base >); \ | ||
90 | } | ||
91 | |||
92 | template <typename Derived, typename Base> | ||
93 | Base * UntrustedObjectCreatorWithArgs(const string &name, const string &args, | ||
94 | bool trusted) { | ||
95 | if (!trusted) return 0; | ||
96 | return new Derived(args); | ||
97 | } | ||
98 | |||
99 | #define REGISTER_UNTRUSTED_OBJECT_WITH_ARGS(name, derived, base) \ | ||
100 | namespace { \ | ||
101 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<base >::instance().registerObject(#name, FbTk::UntrustedObjectCreatorWithArgs<derived, base >); \ | ||
102 | } | ||
103 | |||
104 | #define REGISTER_UNTRUSTED_OBJECT_WITH_ARGS_NSBASE(name, derived, space, base) \ | ||
105 | namespace { \ | ||
106 | static const bool p_register_##type_##name = FbTk::ObjectRegistry<space::base >::instance().registerObject(#name, FbTk::UntrustedObjectCreatorWithArgs<derived, space::base >); \ | ||
107 | } | ||
108 | |||
109 | template <typename Base> | ||
110 | class ObjectRegistry { | 31 | class ObjectRegistry { |
111 | public: | 32 | public: |
112 | typedef Base * CreateFunction(const string &name, const string &args, bool trusted); | 33 | typedef std::map<std::string, Creator> CreatorMap; |
113 | typedef std::map<string, CreateFunction *> CreatorMap; | ||
114 | 34 | ||
115 | static ObjectRegistry<Base > &instance() { | 35 | static ObjectRegistry<Creator> &instance() { |
116 | static ObjectRegistry<Base > s_instance; | 36 | static ObjectRegistry<Creator> s_instance; |
117 | return s_instance; | 37 | return s_instance; |
118 | } | 38 | } |
119 | 39 | ||
120 | Base *parse(const string &name, const string &args, bool trusted = true) const { | 40 | Creator lookup(const std::string &name) { |
121 | string lc = StringUtil::toLower(name); | 41 | typename CreatorMap::const_iterator it = m_creators.find(name); |
122 | typename CreatorMap::const_iterator it = m_creators.find(lc.c_str()); | ||
123 | if (it == m_creators.end()) | 42 | if (it == m_creators.end()) |
124 | return 0; | 43 | return 0; |
125 | else | 44 | return it->second; |
126 | return it->second(lc, args, trusted); | ||
127 | } | ||
128 | |||
129 | Base *parse(const string &line, bool trusted = true) const { | ||
130 | // parse args and command | ||
131 | string command, args; | ||
132 | StringUtil::getFirstWord(line, command, args); | ||
133 | StringUtil::removeFirstWhitespace(args); | ||
134 | StringUtil::removeTrailingWhitespace(args); | ||
135 | |||
136 | // now we have parsed command and args | ||
137 | return parse(command, args, trusted); | ||
138 | } | 45 | } |
139 | 46 | ||
140 | bool registerObject(string name, CreateFunction createFunction) { | 47 | bool registerObject(const std::string &name, Creator creator) { |
141 | name = StringUtil::toLower(name); | 48 | m_creators[name] = creator; |
142 | m_creators[name] = createFunction; | ||
143 | return true; | 49 | return true; |
144 | } | 50 | } |
145 | 51 | ||