Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
functors.h
Go to the documentation of this file.
1 /***************************************************************************
2 * Copyright (C) 2005 by Matthew Adams *
3 * roguestar191 at comcast dot net *
4 * *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19 ***************************************************************************/
20 #include <cstdlib>
21 #ifdef FUNCTORS_INC
22 #else
23 #define FUNCTORS_INC 1
25 {
26 public: Attributes()
27  {
28  hidden = false;
29  webbcmd = false;
30  immcmd = false;
31  }
32  bool hidden; //hidden
33  bool webbcmd; //web command
34  bool immcmd; //immortal command
35  int type;
36 //nothing returns yet anyway, strings may be the most useful?
37  class returnType
38  {
39 public: returnType() {}
40  returnType( const returnType &in )
41  {
42  if (in.s.size() > 0)
43  s.append( in.s );
44  }
45  std::string s;
46  };
48 };
49 
50 class TFunctor
51 {
52 public:
54  virtual ~TFunctor() {}
55  virtual void * Call( std::vector< std::string > &d, int &sock_in, bool *isDown ) = 0;
56 };
57 template < class TClass >
58 class Functor : public TFunctor
59 {
60 //To add a new callback method, add a new fpt type here,
61 //set it to NULL in nullify, then add it to the list
62 //of if/else in the main Call method.
63 private:
64  void (TClass::*fpt1)();
65  void (TClass::*fpt2)(std::string&);
66  void (TClass::*fpt3)(const char*);
67  void (TClass::*fpt4)(const char *array[]);
68  void (TClass::*fpt5)(const char*, const char*);
69  void (TClass::*fpt6)(bool*);
70  void (TClass::*fpt7)(int);
71  void (TClass::*fpt8)(char);
72  void (TClass::*fpt9)(std::vector< std::string* > *d);
73  void (TClass::*fpt10)(std::vector< std::string* > *d, int &sock_in);
74  void (TClass::*fpt11)(std::string&, int &);
75  void (TClass::*fpt12)(std::vector< std::string* >*, int &, bool);
76  TClass *pt2Object; //pointer to object
77 public:
78 //New singularlized call method {{{:
79  virtual void * Call( std::vector< std::string > &d, int &sock_in, bool *isDown )
80  {
81  //Comments {{{
82  //ok, d[0] == command typed
83  //d[1] == arg1
84  //d[2] == arg2, etc.
85  //sometimes socket can be ignored
86  //}}}
87  if (fpt1 != NULL) {
88  //fpt1() no args {{{
89  (*pt2Object.*fpt1)();
90  }
91  //}}}
92  else if (fpt2 != NULL) {
93  //fpt2(std::string &) {{{
94  std::string a;
95  unsigned int x;
96  for (x = 0; x < d.size(); x++) {
97  a.append( d[x] );
98  a.append( " " );
99  }
100  (*pt2Object.*fpt2)( a );
101  //}}}
102  } else if (fpt3 != NULL) {
103  //fpt3(const char *); {{{
104  if (d.size() >= 2)
105  (*pt2Object.*fpt3)( d[1].c_str() );
106  else (*pt2Object.*fpt3)( (const char*) NULL );
107  //}}}
108  } else if (fpt4 != NULL) {
109  //(const char *array[]); {{{
110  std::vector< const char* >buf;
111  for (unsigned int c = 0; c < d.size();) {
112  buf.push_back( d[c].c_str() );
113  c++;
114  if ( !( c < d.size() ) )
115  buf.push_back( " " );
116  }
117  (*pt2Object.*fpt4)( &buf[0] );
118  //}}}
119  } else if (fpt5 != NULL) {
120  //(const char *, const char *); {{{
121  if (d.size() < 2)
122  (*pt2Object.*fpt5)( (const char*) NULL, (const char*) NULL );
123  else if (d.size() < 3)
124  (*pt2Object.*fpt5)( d[1].c_str(), (const char*) NULL );
125  else
126  (*pt2Object.*fpt5)( d[1].c_str(), d[2].c_str() );
127  //}}}
128  } else if (fpt6 != NULL) {
129  //(bool *); {{{
130  (*pt2Object.*fpt6)( isDown );
131  }
132  //}}}
133  else if (fpt7 != NULL) {
134  //(int) {{{
135  if (d.size() < 2)
136  (*pt2Object.*fpt7)( 0 );
137  else
138  (*pt2Object.*fpt7)( atoi( d[1].c_str() ) );
139  //}}}
140  } else if (fpt8 != NULL) {
141  //(char) {{{
142  if (d.size() < 2) {
143  char err = 0;
144  (*pt2Object.*fpt8)( err );
145  } else {
146  (*pt2Object.*fpt8)( d[1][0] );
147  //}}}
148  }
149  } else if (fpt9 != NULL) {
150  //(std::vector<std::string *> *d) {{{
151  std::vector< std::string* >dup;
152  std::vector< std::string >::iterator ptr = d.begin();
153  while ( ptr < d.end() ) {
154  dup.push_back( &( *(ptr) ) );
155  ptr++;
156  }
157  (*pt2Object.*fpt9)( &dup );
158  //}}}
159  } else if (fpt10 != NULL) {
160  //(std::vector<std::string *> *d, int) {{{
161  std::vector< std::string* >dup;
162  std::vector< std::string >::iterator ptr = d.begin();
163  while ( ptr < d.end() ) {
164  dup.push_back( &( *(ptr) ) );
165  ptr++;
166  }
167  (*pt2Object.*fpt10)( &dup, sock_in );
168  //}}}
169  } else if (fpt11 != NULL) {
170  //(std::string &, int&); {{{
171  std::string a;
172  unsigned int x;
173  for (x = 0; x < d.size(); x++) {
174  a.append( d[x] );
175  a.append( " " );
176  }
177  (*pt2Object.*fpt11)( a, sock_in );
178  //}}}
179  } else if (fpt12 != NULL) {
180  //(std::vector<std::string *> *, int &, bool); // {{{
181  std::vector< std::string* >dup;
182  std::vector< std::string >::iterator ptr = d.begin();
183  while ( ptr < d.end() ) {
184  dup.push_back( &( *(ptr) ) );
185  ptr++;
186  }
187  (*pt2Object.*fpt12)( &dup, sock_in, false );
188  } //}}}
189  return &(attribs.m_return);
190 
191  return NULL;
192  } //}}}
193  void nullify()
194  {
195  //Set all the fpt's to null {{{
196  fpt1 = NULL;
197  fpt2 = NULL;
198  fpt3 = NULL;
199  fpt4 = NULL;
200  fpt5 = NULL;
201  fpt6 = NULL;
202  fpt7 = NULL;
203  fpt8 = NULL;
204  fpt9 = NULL;
205  fpt10 = NULL;
206  fpt11 = NULL;
207  fpt12 = NULL;
208  } //Nullify }}}
209  //Constructors, call nullify, set pt2object and function pointer {{{
210  Functor( TClass *_pt2Object, void(TClass::*_fpt)() )
211  {
212  nullify();
213  pt2Object = _pt2Object;
214  fpt1 = _fpt;
215  }
216 //1 std::string
217  Functor( TClass *_pt2Object, void(TClass::*_fpt)(std::string&) )
218  {
219  nullify();
220  pt2Object = _pt2Object;
221  fpt2 = _fpt;
222  }
223 //1 c string
224  Functor( TClass *_pt2Object, void(TClass::*_fpt)(const char*) )
225  {
226  nullify();
227  pt2Object = _pt2Object;
228  fpt3 = _fpt;
229  }
230  Functor( TClass *_pt2Object, void(TClass::*_fpt)(const char *array[]) )
231  {
232  nullify();
233  pt2Object = _pt2Object;
234  fpt4 = _fpt;
235  }
236 //2 c strings
237  Functor( TClass *_Obj, void(TClass::*_fpt)(const char*, const char*) )
238  {
239  nullify();
240  pt2Object = _Obj;
241  fpt5 = _fpt;
242  }
243 //1 bool
244  Functor( TClass *_Obj, void(TClass::*_fpt)(bool*) )
245  {
246  nullify();
247  pt2Object = _Obj;
248  fpt6 = _fpt;
249  }
250 
251  Functor( TClass *_Obj, void(TClass::*_fpt)(int) )
252  {
253  nullify();
254  pt2Object = _Obj;
255  fpt7 = _fpt;
256  }
257 
258  Functor( TClass *_Obj, void(TClass::*_fpt)(char) )
259  {
260  nullify();
261  pt2Object = _Obj;
262  fpt8 = _fpt;
263  }
264 
265  Functor( TClass *_Obj, void(TClass::*_fpt)(std::vector< std::string* > *d) )
266  {
267  nullify();
268  pt2Object = _Obj, fpt9 = _fpt;
269  }
270 
271  Functor( TClass *_Obj, void(TClass::*_fpt)(std::vector< std::string* > *d, int &) )
272  {
273  nullify();
274  pt2Object = _Obj, fpt10 = _fpt;
275  }
276 
277  Functor( TClass *_pt2Object, void(TClass::*_fpt)(std::string&, int &) )
278  {
279  nullify();
280  pt2Object = _pt2Object;
281  fpt11 = _fpt;
282  }
283 
284  Functor( TClass *_Obj, void(TClass::*_fpt)(std::vector< std::string* > *d, int &, bool) )
285  {
286  nullify();
287  pt2Object = _Obj, fpt12 = _fpt;
288  }
289 //}}}
290 
291  virtual ~Functor() {}
292 };
293 
294 #endif
295 
296 /*
297  * Local variables:
298  * tab-width: 4
299  * c-basic-offset: 4
300  * End:
301  * vim600: sw=4 ts=4 fdm=marker
302  * vim<600: sw=4 ts=4
303  */
304