Orxonox  0.0.5 Codename: Arcturus
Functor.h
Go to the documentation of this file.
1 /*
2  * ORXONOX - the hottest 3D action shooter ever to exist
3  * > www.orxonox.net <
4  *
5  *
6  * License notice:
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * Author:
23  * Fabian 'x3n' Landau
24  * Co-authors:
25  * ...
26  *
27  */
28 
113 #ifndef _Functor_H__
114 #define _Functor_H__
115 
116 #include "core/CorePrereqs.h"
117 
118 #include <typeinfo>
119 
120 #include "util/Output.h"
121 #include "util/MultiType.h"
122 #include "core/object/Destroyable.h"
123 #include "FunctorPtr.h"
124 
125 namespace orxonox
126 {
127  const unsigned int MAX_FUNCTOR_ARGUMENTS = 5;
128 
129  namespace detail
130  {
131  template <class T>
132  inline std::string _typeToString() { return "unknown"; }
133 
134  template <> inline std::string _typeToString<void>() { return "void"; }
135  template <> inline std::string _typeToString<int>() { return "int"; }
136  template <> inline std::string _typeToString<unsigned int>() { return "uint"; }
137  template <> inline std::string _typeToString<char>() { return "char"; }
138  template <> inline std::string _typeToString<unsigned char>() { return "uchar"; }
139  template <> inline std::string _typeToString<short>() { return "short"; }
140  template <> inline std::string _typeToString<unsigned short>() { return "ushort"; }
141  template <> inline std::string _typeToString<long>() { return "long"; }
142  template <> inline std::string _typeToString<unsigned long>() { return "ulong"; }
143  template <> inline std::string _typeToString<long long>() { return "longlong"; }
144  template <> inline std::string _typeToString<unsigned long long>() { return "ulonglong"; }
145  template <> inline std::string _typeToString<float>() { return "float"; }
146  template <> inline std::string _typeToString<double>() { return "double"; }
147  template <> inline std::string _typeToString<long double>() { return "longdouble"; }
148  template <> inline std::string _typeToString<bool>() { return "bool"; }
149  template <> inline std::string _typeToString<std::string>() { return "string"; }
150  template <> inline std::string _typeToString<Vector2>() { return "Vector2"; }
151  template <> inline std::string _typeToString<Vector3>() { return "Vector3"; }
152  template <> inline std::string _typeToString<Quaternion>() { return "Quaternion"; }
153  template <> inline std::string _typeToString<ColourValue>() { return "ColourValue"; }
154  template <> inline std::string _typeToString<Radian>() { return "Radian"; }
155  template <> inline std::string _typeToString<Degree>() { return "Degree"; }
156  }
157 
159  template <class T>
160  inline std::string typeToString() { return detail::_typeToString<typename Loki::TypeTraits<T>::UnqualifiedReferredType>(); }
161 
176  {
177  public:
179  enum class Type
180  {
181  Static,
182  Member
183  };
184 
185  public:
186  virtual ~Functor() = default;
187 
189  virtual MultiType operator()(const MultiType& param1 = MultiType::Null, const MultiType& param2 = MultiType::Null, const MultiType& param3 = MultiType::Null, const MultiType& param4 = MultiType::Null, const MultiType& param5 = MultiType::Null) = 0;
190 
192  virtual FunctorPtr clone() = 0;
193 
195  virtual Type getType() const = 0;
197  virtual unsigned int getParamCount() const = 0;
199  virtual bool hasReturnvalue() const = 0;
200 
202  virtual std::string getTypenameParam(unsigned int index) const = 0;
204  virtual std::string getTypenameReturnvalue() const = 0;
205 
207  virtual void evaluateArgument(unsigned int index, MultiType& argument) const = 0;
208 
210  virtual void setRawObjectPointer(void* object) = 0;
212  virtual void* getRawObjectPointer() const = 0;
213 
215  virtual void setSafeMode(bool bSafeMode) = 0;
216 
218  virtual const std::type_info& getFullIdentifier() const = 0;
220  virtual const std::type_info& getHeaderIdentifier() const = 0;
222  virtual const std::type_info& getHeaderIdentifier(unsigned int params) const = 0;
223  };
224 
236  template <class O>
238  {
239  public:
241  FunctorMember(O* object = nullptr) : object_(object), bSafeMode_(false) {}
242  virtual ~FunctorMember() { if (this->bSafeMode_) { this->unregisterObject(this->object_); } }
243 
245  virtual MultiType operator()(O* object, const MultiType& param1 = MultiType::Null, const MultiType& param2 = MultiType::Null, const MultiType& param3 = MultiType::Null, const MultiType& param4 = MultiType::Null, const MultiType& param5 = MultiType::Null) = 0;
246 
247  // see Functor::operator()()
248  virtual MultiType operator()(const MultiType& param1 = MultiType::Null, const MultiType& param2 = MultiType::Null, const MultiType& param3 = MultiType::Null, const MultiType& param4 = MultiType::Null, const MultiType& param5 = MultiType::Null) override
249  {
250  // call the function if an object was assigned
251  if (this->object_)
252  return (*this)(this->object_, param1, param2, param3, param4, param5);
253  else
254  {
255  orxout(internal_error) << "Can't execute FunctorMember, no object set." << endl;
256  return MultiType::Null;
257  }
258  }
259 
260  // see Functor::getType()
261  virtual inline Functor::Type getType() const override
262  { return Functor::Type::Member; }
263 
265  inline void setObject(O* object)
266  {
267  if (this->bSafeMode_ && object != this->object_)
268  {
269  this->unregisterObject(this->object_);
270  this->registerObject(object);
271  }
272  this->object_ = object;
273  }
275  inline O* getObject() const
276  { return this->object_; }
277 
278  // see Functor::setRawObjectPointer()
279  virtual inline void setRawObjectPointer(void* object) override
280  { this->setObject((O*)object); }
281  // see Functor::getRawObjectPointer()
282  virtual inline void* getRawObjectPointer() const override
283  { return this->object_; }
284 
285  // see Functor::setSafeMode()
286  virtual inline void setSafeMode(bool bSafeMode) override
287  {
288  if (bSafeMode == this->bSafeMode_)
289  return;
290 
291  this->bSafeMode_ = bSafeMode;
292 
293  if (bSafeMode)
294  this->registerObject(this->object_);
295  else
296  this->unregisterObject(this->object_);
297  }
298 
299  protected:
301  inline void registerObject(Destroyable* object)
302  { this->registerAsDestructionListener(object); }
303 
304  inline void registerObject(void* object) {}
305 
307  inline void unregisterObject(Destroyable* object)
308  { this->unregisterAsDestructionListener(object); }
309 
310  inline void unregisterObject(void* object) {}
311 
313  virtual inline void objectDeleted() override
314  { this->object_ = nullptr; }
315 
317  bool bSafeMode_;
318  };
319 
321  template <>
322  class FunctorMember<void> : public Functor
323  {
324  public:
326  FunctorMember(void* object = nullptr) {}
327 
329  virtual MultiType operator()(void* object, const MultiType& param1 = MultiType::Null, const MultiType& param2 = MultiType::Null, const MultiType& param3 = MultiType::Null, const MultiType& param4 = MultiType::Null, const MultiType& param5 = MultiType::Null) = 0;
330 
331  // see Functor::operator()()
332  virtual MultiType operator()(const MultiType& param1 = MultiType::Null, const MultiType& param2 = MultiType::Null, const MultiType& param3 = MultiType::Null, const MultiType& param4 = MultiType::Null, const MultiType& param5 = MultiType::Null) override
333  {
334  return (*this)((void*)nullptr, param1, param2, param3, param4, param5);
335  }
336 
337  // see Functor::getType()
338  virtual inline Functor::Type getType() const override
339  { return Functor::Type::Static; }
340 
341  // see Functor::setRawObjectPointer()
342  virtual inline void setRawObjectPointer(void*) override
343  { orxout(internal_warning) << "Can't assign an object pointer to a static functor" << endl; }
344  // see Functor::getRawObjectPointer()
345  virtual inline void* getRawObjectPointer() const override
346  { return nullptr; }
347 
348  // see Functor::setSafeMode()
349  virtual inline void setSafeMode(bool) override {}
350  };
351 
354 
368  template <class F, class O = void>
369  class FunctorPointer : public FunctorMember<O>
370  {
371  public:
373  FunctorPointer(F functionPointer, O* object = nullptr) : FunctorMember<O>(object), functionPointer_(functionPointer) {}
374 
376  inline void setFunction(F functionPointer)
377  { this->functionPointer_ = functionPointer; }
379  inline F getFunction() const
380  { return this->functionPointer_; }
381 
382  protected:
384  };
385 
386  namespace detail
387  {
388  // Helper class to get the type of the function-pointer (or the function-object) with the given class, parameters, return-value, and constness
389  template <class F, class R, class O, bool isconst, class... Params> struct FunctionType /* generic type is undefined */;
390  template < class R, class O, class... Params> struct FunctionType<void, R, O, false, Params...> { typedef R (O::*Type)(Params...); }; // spezialization: non-const member function
391  template < class R, class O, class... Params> struct FunctionType<void, R, O, true, Params...> { typedef R (O::*Type)(Params...) const; }; // spezialization: const member function
392  template < class R, class... Params> struct FunctionType<void, R, void, false, Params...> { typedef R (*Type)(Params...); }; // spezialization: static function
393  template <class F, class R, class... Params> struct FunctionType<F, R, void, false, Params...> { typedef F Type; }; // spezialization: function object
394 
395  // Helper class, used to call a function with a given object and parameters and to return its return-value (if available)
396  template <class F, class R, class O, bool isconst, class... Params> struct FunctorCaller /* generic type is undefined */;
397  template < class R, class O, bool isconst, class... Params> struct FunctorCaller<void, R, O, isconst, Params...> { template <class... UnusedParams> static inline MultiType call(typename detail::FunctionType<void, R, O, isconst, Params...>::Type functionPointer, O* object, const Params&... parameters, const UnusedParams&...) { return (object->*functionPointer)(parameters...); } }; // spezialization: member function with return value
398  template < class O, bool isconst, class... Params> struct FunctorCaller<void, void, O, isconst, Params...> { template <class... UnusedParams> static inline MultiType call(typename detail::FunctionType<void, void, O, isconst, Params...>::Type functionPointer, O* object, const Params&... parameters, const UnusedParams&...) { (object->*functionPointer)(parameters...); return MultiType::Null; } }; // spezialization: member function without return value
399  template < class R, class... Params> struct FunctorCaller<void, R, void, false, Params...> { template <class... UnusedParams> static inline MultiType call(typename detail::FunctionType<void, R, void, false, Params...>::Type functionPointer, void*, const Params&... parameters, const UnusedParams&...) { return (*functionPointer)(parameters...); } }; // spezialization: static function with return value
400  template < class... Params> struct FunctorCaller<void, void, void, false, Params...> { template <class... UnusedParams> static inline MultiType call(typename detail::FunctionType<void, void, void, false, Params...>::Type functionPointer, void*, const Params&... parameters, const UnusedParams&...) { (*functionPointer)(parameters...); return MultiType::Null; } }; // spezialization: static function without return value
401  template <class F, class R, class... Params> struct FunctorCaller<F, R, void, false, Params...> { template <class... UnusedParams> static inline MultiType call(typename detail::FunctionType<F, R, void, false, Params...>::Type functor, void*, const Params&... parameters, const UnusedParams&...) { return functor(parameters...); } }; // spezialization: function object with return value
402  template <class F, class... Params> struct FunctorCaller<F, void, void, false, Params...> { template <class... UnusedParams> static inline MultiType call(typename detail::FunctionType<F, void, void, false, Params...>::Type functor, void*, const Params&... parameters, const UnusedParams&...) { functor(parameters...); return MultiType::Null; } }; // spezialization: function object without return value
403 
404  // Helper class to determine if a function has a returnvalue
405  template <class T>
406  struct FunctorHasReturnvalue
407  { enum { result = true }; };
408  template <>
409  struct FunctorHasReturnvalue<void>
410  { enum { result = false }; };
411 
412  // Helper class to determine the N-th parameter of a variadic template (with 0 being the index of the first parameter)
413  template <int n, typename T = void, typename... Other>
414  struct GetNthParamType
415  { typedef typename GetNthParamType<n - 1, Other...>::Type Type; };
416  template <typename T, typename... Other>
417  struct GetNthParamType<0, T, Other...>
418  { typedef T Type; };
419 
420  // Helper structs to deduce the first N types of a parameter pack
421  template<class... Types> struct type_list {};
422 
423  template <class T1, class... AllTypes>
424  struct make_type_list_helper
425  {
426  template <std::size_t N, class... Types>
427  struct make_type_list_impl : make_type_list_helper<AllTypes...>::template make_type_list_impl<N - 1, Types..., T1> {};
428 
429  template <class... Types>
430  struct make_type_list_impl<1u, Types...> : type_list<Types..., T1> {};
431  };
432 
433  template <class T1>
434  struct make_type_list_helper<T1>
435  {
436  template <std::size_t N, class... Types>
437  struct make_type_list_impl : type_list<Types..., T1> {};
438  };
439 
440  template <std::size_t N, class... Types>
441  struct make_type_list : make_type_list_helper<Types...>::template make_type_list_impl<N> {};
442 
443  template <class... Types>
444  struct make_type_list<0u, Types...> : type_list<> {};
445 
446  template <std::size_t N>
447  struct make_type_list<N> : type_list<> {};
448 
449  template <>
450  struct make_type_list<0u> : type_list<> {};
451  }
452 
470  template <class F, class R, class O, bool isconst, class... Params>
471  class FunctorTemplate : public FunctorPointer<typename detail::FunctionType<F, R, O, isconst, Params...>::Type, O>
472  {
473  static_assert(sizeof...(Params) <= 5, "Only up to 5 parameters are supported");
474 
475  public:
477  FunctorTemplate(typename detail::FunctionType<F, R, O, isconst, Params...>::Type functionPointer, O* object = nullptr) : FunctorPointer<typename detail::FunctionType<F, R, O, isconst, Params...>::Type, O>(functionPointer, object) {}
478 
479  // see FunctorMember::operator()()
480  virtual MultiType operator()(O* object, const MultiType& param1 = MultiType::Null, const MultiType& param2 = MultiType::Null, const MultiType& param3 = MultiType::Null, const MultiType& param4 = MultiType::Null, const MultiType& param5 = MultiType::Null) override
481  {
482  return detail::FunctorCaller<F, R, O, isconst, Params...>::call(this->functionPointer_, object, param1, param2, param3, param4, param5);
483  }
484 
485  // see Functor::clone()
486  virtual FunctorPtr clone() override
487  {
488  return std::make_shared<FunctorTemplate>(*this);
489  }
490 
491  // see Functor::evaluateArgument()
492  virtual void evaluateArgument(unsigned int index, MultiType& argument) const override
493  {
494  switch (index)
495  {
496  case 0: argument.convert<typename detail::GetNthParamType<0, Params...>::Type>(); break;
497  case 1: argument.convert<typename detail::GetNthParamType<1, Params...>::Type>(); break;
498  case 2: argument.convert<typename detail::GetNthParamType<2, Params...>::Type>(); break;
499  case 3: argument.convert<typename detail::GetNthParamType<3, Params...>::Type>(); break;
500  case 4: argument.convert<typename detail::GetNthParamType<4, Params...>::Type>(); break;
501  }
502  }
503 
504  // see Functor::getParamCount()
505  virtual unsigned int getParamCount() const override
506  {
507  return sizeof...(Params);
508  }
509 
510  // see Functor::hasReturnvalue()
511  virtual bool hasReturnvalue() const override
512  {
513  return detail::FunctorHasReturnvalue<R>::result;
514  }
515 
516  // see Functor::getTypenameParam()
517  virtual std::string getTypenameParam(unsigned int index) const override
518  {
519  switch (index)
520  {
521  case 0: return typeToString<typename detail::GetNthParamType<0, Params...>::Type>();
522  case 1: return typeToString<typename detail::GetNthParamType<1, Params...>::Type>();
523  case 2: return typeToString<typename detail::GetNthParamType<2, Params...>::Type>();
524  case 3: return typeToString<typename detail::GetNthParamType<3, Params...>::Type>();
525  case 4: return typeToString<typename detail::GetNthParamType<4, Params...>::Type>();
526  default: return "";
527  }
528  }
529 
530  // see Functor::getTypenameReturnvalue()
531  virtual std::string getTypenameReturnvalue() const override
532  {
533  return typeToString<R>();
534  }
535 
536  // see Functor::getFullIdentifier()
537  virtual const std::type_info& getFullIdentifier() const override
538  {
539  return typeid(typename detail::FunctionType<void, R, O, isconst, Params...>::Type);
540  }
541 
542  // see Functor::getHeaderIdentifier()
543  virtual const std::type_info& getHeaderIdentifier() const override
544  {
545  return typeid(typename detail::FunctionType<void, R, void, false, Params...>::Type);
546  }
547 
548  // see Functor::getHeaderIdentifier(unsigned int)
549  virtual const std::type_info& getHeaderIdentifier(unsigned int params) const override
550  {
551  switch (params)
552  {
553  case 0: return this->getTypelistIdentifier(detail::make_type_list<0, Params...>{});
554  case 1: return this->getTypelistIdentifier(detail::make_type_list<1, Params...>{});
555  case 2: return this->getTypelistIdentifier(detail::make_type_list<2, Params...>{});
556  case 3: return this->getTypelistIdentifier(detail::make_type_list<3, Params...>{});
557  case 4: return this->getTypelistIdentifier(detail::make_type_list<4, Params...>{});
558  default: return this->getTypelistIdentifier(detail::make_type_list<5, Params...>{});
559  }
560  }
561 
562  private:
564  template<class... Types>
565  const std::type_info& getTypelistIdentifier(detail::type_list<Types...>) const
566  {
567  return typeid(typename detail::FunctionType<void, R, void, false, Types...>::Type);
568  }
569  };
570 
571 
572  namespace detail
573  {
574  // Helper functions to deduce types and constness of operator() and return the correct FunctorTemplate
575  template <class F>
576  struct CallableHelper
577  {
578  template <class R, class... Params> static inline FunctorStaticPtr create(const F& functionObject, R(F::*)(Params...)) { return std::make_shared<FunctorTemplate<F, R, void, false, Params...>>(functionObject); }
579  template <class R, class... Params> static inline FunctorStaticPtr create(const F& functionObject, R(F::*)(Params...) const) { return std::make_shared<FunctorTemplate<F, R, void, false, Params...>>(functionObject); } // note: both const and non-const function-objects are treated as static functors with isconst=false.
580  };
581  }
582 
583  template <class R, class O, class OO, class... Params> inline FunctorMemberPtr<O> createFunctor(R (O::*functionPointer)(Params...), OO* object) { return std::make_shared<FunctorTemplate<void, R, O, false, Params...>>(functionPointer, object); }
584  template <class R, class O, class OO, class... Params> inline FunctorMemberPtr<O> createFunctor(R (O::*functionPointer)(Params...) const, OO* object) { return std::make_shared<FunctorTemplate<void, R, O, true, Params...>>(functionPointer, object); }
585 
586  template <class R, class O, class... Params> inline FunctorMemberPtr<O> createFunctor(R (O::*functionPointer)(Params...)) { return std::make_shared<FunctorTemplate<void, R, O, false, Params...>>(functionPointer); }
587  template <class R, class O, class... Params> inline FunctorMemberPtr<O> createFunctor(R (O::*functionPointer)(Params...) const) { return std::make_shared<FunctorTemplate<void, R, O, true, Params...>>(functionPointer); }
588 
589  template <class R, class... Params> inline FunctorStaticPtr createFunctor(R (*functionPointer)(Params...)) { return std::make_shared<FunctorTemplate<void, R, void, false, Params...>>(functionPointer); }
590 
592  template <class F> inline FunctorStaticPtr createFunctor(const F& functionObject) { return detail::CallableHelper<F>::create(functionObject, &F::operator()); }
593 }
594 
595 #endif /* _Functor_H__ */
virtual void setRawObjectPointer(void *) override
Assigns an object-pointer to the functor which is used to execute a member-function.
Definition: Functor.h:342
std::shared_ptr< Functor > FunctorPtr
Definition: FunctorPtr.h:57
virtual MultiType operator()(const MultiType &param1=MultiType::Null, const MultiType &param2=MultiType::Null, const MultiType &param3=MultiType::Null, const MultiType &param4=MultiType::Null, const MultiType &param5=MultiType::Null) override
Calls the function-pointer with up to five arguments. In case of a member-function, the assigned object-pointer is used to call the function.
Definition: Functor.h:332
The Functor classes are used to wrap function pointers.
Definition: Functor.h:175
virtual Functor::Type getType() const override
Returns the type of the function: static or member.
Definition: Functor.h:261
Definition: InputPrereqs.h:82
virtual bool hasReturnvalue() const override
Returns true if the function has a return-value.
Definition: Functor.h:511
F functionPointer_
The stored function-pointer.
Definition: Functor.h:383
virtual std::string getTypenameReturnvalue() const override
Returns the type-name of the return-value.
Definition: Functor.h:531
Typedefs and definitions of FunctorPtr, FunctorMemberPtr, FunctorStaticPtr, and FunctorPointerPtr.
virtual void * getRawObjectPointer() const override
Returns the object-pointer.
Definition: Functor.h:345
virtual ~FunctorMember()
Definition: Functor.h:242
virtual const std::type_info & getFullIdentifier() const override
Returns the full identifier of the function-pointer which is defined as typeid(F), where F is the type of the stored function-pointer. Used to compare functors.
Definition: Functor.h:537
void registerObject(void *object)
Definition: Functor.h:304
Shared library macros, enums, constants and forward declarations for the core library ...
::std::string string
Definition: gtest-port.h:756
void registerObject(Destroyable *object)
Casts the object and registers as destruction listener if the object is a Destroyable.
Definition: Functor.h:301
Definition: InputPrereqs.h:107
Output level, used for warnings which are important for developers.
Definition: OutputDefinitions.h:96
O * object_
The stored object-pointer, used to execute a member-function (or nullptr for static functions) ...
Definition: Functor.h:316
virtual const std::type_info & getHeaderIdentifier() const override
Returns an identifier of the header of the function (doesn&#39;t include the function&#39;s class)...
Definition: Functor.h:543
bool bSafeMode_
If true, the functor is in safe mode and registers itself as listener at the object and changes the p...
Definition: Functor.h:317
virtual void setSafeMode(bool) override
Enables or disables the safe mode which causes the functor to change the object pointer to nullptr if...
Definition: Functor.h:349
Type
Defines the type of a function (static or member)
Definition: Functor.h:179
FunctorMember is a child class of Functor and expands it with an object-pointer, that is used for mem...
Definition: Functor.h:237
Output level, used for error messages which are important for developers.
Definition: OutputDefinitions.h:95
Definition: InputPrereqs.h:91
O * getObject() const
Returns the object-pointer.
Definition: Functor.h:275
void unregisterObject(Destroyable *object)
Casts the object and unregisters as destruction listener if the object is a Destroyable.
Definition: Functor.h:307
bool convert()
Converts the current value to type T.
Definition: MultiType.h:374
std::string typeToString()
Returns the name of type T as string.
Definition: Functor.h:160
typedef void(ENET_CALLBACK *ENetPacketFreeCallback)(struct _ENetPacket *)
Specialization of FunctorMember with T = void.
Definition: Functor.h:322
FunctorMemberPtr< O > createFunctor(R(O::*functionPointer)(Params...), OO *object)
Creates a new FunctorMember with the given function-pointer and an assigned object.
Definition: Functor.h:583
FunctorMember(O *object=nullptr)
Constructor: Stores the object-pointer.
Definition: Functor.h:241
virtual void setRawObjectPointer(void *object) override
Assigns an object-pointer to the functor which is used to execute a member-function.
Definition: Functor.h:279
void unregisterObject(void *object)
Definition: Functor.h:310
virtual FunctorPtr clone() override
Creates a new instance of Functor with the same values like this (used instead of a copy-constructor)...
Definition: Functor.h:486
Definition: InputPrereqs.h:77
virtual void evaluateArgument(unsigned int index, MultiType &argument) const override
Converts a given argument to the type of the parameter with given index (the first parameter has inde...
Definition: Functor.h:492
OutputStream & orxout(OutputLevel level=level::debug_output, const OutputContextContainer &context=context::undefined())
This helper function returns a reference to a commonly used instance of OutputStream.
Definition: Output.h:81
Die Wagnis Klasse hat die folgenden Aufgaben:
Definition: ApplicationPaths.cc:66
Declaration of the MultiType and some helper constructs.
#define _CoreExport
Definition: CorePrereqs.h:61
The MultiType can hold a value of many possible types and convert them to other types.
Definition: MultiType.h:130
virtual unsigned int getParamCount() const override
Returns the number of parameters of the function.
Definition: Functor.h:505
Declaration of Destroyable, the base class of all objects which can be used with StrongPtr and WeakPt...
This listener is used to inform weak pointers if an object of type Destroyable gets destroyed...
Definition: Destroyable.h:97
static const MultiType Null
Definition: MultiType.h:304
virtual void setSafeMode(bool bSafeMode) override
Enables or disables the safe mode which causes the functor to change the object pointer to nullptr if...
Definition: Functor.h:286
Defines the helper function orxout() and includes all necessary headers to use the output system...
Definition: InputPrereqs.h:78
virtual const std::type_info & getHeaderIdentifier(unsigned int params) const override
Returns an identifier of the header of the function (doesn&#39;t include the function&#39;s class)...
Definition: Functor.h:549
FunctorMember< void > FunctorStatic
FunctorStatic is just a typedef of FunctorMember with T = void.
Definition: Functor.h:353
const std::type_info & getTypelistIdentifier(detail::type_list< Types... >) const
Helper function that deduces a parameter pack of types and returns the corresponding identifier...
Definition: Functor.h:565
const unsigned int MAX_FUNCTOR_ARGUMENTS
The maximum number of parameters of a function that is supported by Functor.
Definition: Functor.h:127
std::shared_ptr< FunctorMember< void >> FunctorStaticPtr
Definition: FunctorPtr.h:60
Type
Each Input class has a General Type variable, a form of RTTI.
Definition: OISPrereqs.h:138
virtual MultiType operator()(const MultiType &param1=MultiType::Null, const MultiType &param2=MultiType::Null, const MultiType &param3=MultiType::Null, const MultiType &param4=MultiType::Null, const MultiType &param5=MultiType::Null) override
Calls the function-pointer with up to five arguments. In case of a member-function, the assigned object-pointer is used to call the function.
Definition: Functor.h:248
std::shared_ptr< FunctorMember< T >> FunctorMemberPtr
Definition: FunctorPtr.h:59
virtual Functor::Type getType() const override
Returns the type of the function: static or member.
Definition: Functor.h:338
FunctorTemplate(typename detail::FunctionType< F, R, O, isconst, Params... >::Type functionPointer, O *object=nullptr)
Constructor: Initializes the base class.
Definition: Functor.h:477
FunctorTemplate is a child class of FunctorPointer and implements all functions that need to know the...
Definition: Functor.h:471
virtual void * getRawObjectPointer() const override
Returns the object-pointer.
Definition: Functor.h:282
Classes must inherit from this class if they should be used with StrongPtr or WeakPtr.
Definition: Destroyable.h:47
FunctorPointer(F functionPointer, O *object=nullptr)
Constructor: Initializes the base class and stores the function-pointer.
Definition: Functor.h:373
virtual void objectDeleted() override
Will be called by Destroyable::~Destroyable() if the stored object is a Destroyable and deleted and t...
Definition: Functor.h:313
FunctorMember(void *object=nullptr)
Constructor: Stores the object-pointer.
Definition: Functor.h:326
F getFunction() const
Returns the function-pointer.
Definition: Functor.h:379
void setObject(O *object)
Assigns an object-pointer to the functor which is used to execute a member-function.
Definition: Functor.h:265
void setFunction(F functionPointer)
Changes the function-pointer.
Definition: Functor.h:376
FunctorPointer is a child class of FunctorMember and extends it with a function-pointer (or a functio...
Definition: Functor.h:369
virtual std::string getTypenameParam(unsigned int index) const override
Returns the type-name of the parameter with given index (the first parameter has index 0)...
Definition: Functor.h:517
virtual MultiType operator()(O *object, const MultiType &param1=MultiType::Null, const MultiType &param2=MultiType::Null, const MultiType &param3=MultiType::Null, const MultiType &param4=MultiType::Null, const MultiType &param5=MultiType::Null) override
Calls the function-pointer with up to five arguments and an object. In case of a static-function, the object can be nullptr.
Definition: Functor.h:480