summaryrefslogtreecommitdiffstats
path: root/ml/dlib/dlib/any/any_function_abstract.h
diff options
context:
space:
mode:
Diffstat (limited to 'ml/dlib/dlib/any/any_function_abstract.h')
-rw-r--r--ml/dlib/dlib/any/any_function_abstract.h292
1 files changed, 292 insertions, 0 deletions
diff --git a/ml/dlib/dlib/any/any_function_abstract.h b/ml/dlib/dlib/any/any_function_abstract.h
new file mode 100644
index 00000000..1fc129ed
--- /dev/null
+++ b/ml/dlib/dlib/any/any_function_abstract.h
@@ -0,0 +1,292 @@
+// Copyright (C) 2011 Davis E. King (davis@dlib.net)
+// License: Boost Software License See LICENSE.txt for the full license.
+#undef DLIB_AnY_FUNCTION_ABSTRACT_H_
+#ifdef DLIB_AnY_FUNCTION_ABSTRACT_H_
+
+#include "any_abstract.h"
+#include "../algs.h"
+
+namespace dlib
+{
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename function_type
+ >
+ class any_function
+ {
+ /*!
+ REQUIREMENTS ON function_type
+ This type should be a function signature. Some examples are:
+ void (int,int) // a function returning nothing and taking two ints
+ void () // a function returning nothing and taking no arguments
+ char (double&) // a function returning a char and taking a reference to a double
+
+ The number of arguments in the function must be no greater than 10.
+
+ INITIAL VALUE
+ - is_empty() == true
+ - for all T: contains<T>() == false
+
+ WHAT THIS OBJECT REPRESENTS
+ This object is a version of dlib::any that is restricted to containing
+ elements which are some kind of function object with an operator() which
+ matches the function signature defined by function_type.
+
+
+ Here is an example:
+ #include <iostream>
+ #include <string>
+ #include "dlib/any.h"
+ using namespace std;
+ void print_message(string str) { cout << str << endl; }
+
+ int main()
+ {
+ dlib::any_function<void(string)> f;
+ f = print_message;
+ f("hello world"); // calls print_message("hello world")
+ }
+
+ Note that any_function objects can be used to store general function
+ objects (i.e. defined by a class with an overloaded operator()) in
+ addition to regular global functions.
+ !*/
+
+ public:
+
+ // This is the type of object returned by function_type functions.
+ typedef result_type_for_function_type result_type;
+ // Typedefs defining the argument types. If an argument does not exist
+ // then it is set to void.
+ typedef type_of_first_argument_in_funct_type arg1_type;
+ typedef type_of_second_argument_in_funct_type arg2_type;
+ ...
+ typedef type_of_last_argument_in_funct_type arg10_type;
+ const static unsigned long num_args = total_number_of_non_void_arguments;
+
+ any_function(
+ );
+ /*!
+ ensures
+ - this object is properly initialized
+ !*/
+
+ any_function (
+ const any_function& item
+ );
+ /*!
+ ensures
+ - copies the state of item into *this.
+ - Note that *this and item will contain independent copies of the
+ contents of item. That is, this function performs a deep
+ copy and therefore does not result in *this containing
+ any kind of reference to item.
+ !*/
+
+ template < typename T >
+ any_function (
+ const T& item
+ );
+ /*!
+ ensures
+ - #contains<T>() == true
+ - #cast_to<T>() == item
+ (i.e. a copy of item will be stored in *this)
+ !*/
+
+ void clear (
+ );
+ /*!
+ ensures
+ - #*this will have its default value. I.e. #is_empty() == true
+ !*/
+
+ template <typename T>
+ bool contains (
+ ) const;
+ /*!
+ ensures
+ - if (this object currently contains an object of type T) then
+ - returns true
+ - else
+ - returns false
+ !*/
+
+ bool is_empty(
+ ) const;
+ /*!
+ ensures
+ - if (this object contains any kind of object) then
+ - returns false
+ - else
+ - returns true
+ !*/
+
+ bool is_set (
+ ) const;
+ /*!
+ ensures
+ - returns !is_empty()
+ !*/
+
+ result_type operator() (
+ ) const;
+ /*!
+ requires
+ - is_empty() == false
+ - the signature defined by function_type takes no arguments
+ ensures
+ - Let F denote the function object contained within *this. Then
+ this function performs:
+ return F()
+ or if result_type is void then this function performs:
+ F()
+ !*/
+
+ result_type operator() (
+ const arg1_type& a1
+ ) const;
+ /*!
+ requires
+ - is_empty() == false
+ - the signature defined by function_type takes one argument
+ ensures
+ - Let F denote the function object contained within *this. Then
+ this function performs:
+ return F(a1)
+ or if result_type is void then this function performs:
+ F(a1)
+ !*/
+
+ result_type operator() (
+ const arg1_type& a1,
+ const arg2_type& a2
+ ) const;
+ /*!
+ requires
+ - is_empty() == false
+ - the signature defined by function_type takes two arguments
+ ensures
+ - Let F denote the function object contained within *this. Then
+ this function performs:
+ return F(a1,a2)
+ or if result_type is void then this function performs:
+ F(a1,a2)
+ !*/
+
+ /* !!!!!!!!! NOTE !!!!!!!!!
+
+ In addition to the above, operator() is defined for up to 10 arguments.
+ They are not listed here because it would clutter the documentation.
+
+ !!!!!!!!! NOTE !!!!!!!!! */
+
+ template <typename T>
+ T& cast_to(
+ );
+ /*!
+ ensures
+ - if (contains<T>() == true) then
+ - returns a non-const reference to the object contained within *this
+ - else
+ - throws bad_any_cast
+ !*/
+
+ template <typename T>
+ const T& cast_to(
+ ) const;
+ /*!
+ ensures
+ - if (contains<T>() == true) then
+ - returns a const reference to the object contained within *this
+ - else
+ - throws bad_any_cast
+ !*/
+
+ template <typename T>
+ T& get(
+ );
+ /*!
+ ensures
+ - #is_empty() == false
+ - #contains<T>() == true
+ - if (contains<T>() == true)
+ - returns a non-const reference to the object contained in *this.
+ - else
+ - Constructs an object of type T inside *this
+ - Any previous object stored in this any_function object is destructed and its
+ state is lost.
+ - returns a non-const reference to the newly created T object.
+ !*/
+
+ any_function& operator= (
+ const any_function& item
+ );
+ /*!
+ ensures
+ - copies the state of item into *this.
+ - Note that *this and item will contain independent copies of the
+ contents of item. That is, this function performs a deep
+ copy and therefore does not result in *this containing
+ any kind of reference to item.
+ !*/
+
+ void swap (
+ any_function& item
+ );
+ /*!
+ ensures
+ - swaps *this and item
+ !*/
+
+ };
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename function_type
+ >
+ inline void swap (
+ any_function<function_type>& a,
+ any_function<function_type>& b
+ ) { a.swap(b); }
+ /*!
+ provides a global swap function
+ !*/
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename T,
+ typename function_type
+ >
+ T& any_cast(
+ any_function<function_type>& a
+ ) { return a.cast_to<T>(); }
+ /*!
+ ensures
+ - returns a.cast_to<T>()
+ !*/
+
+// ----------------------------------------------------------------------------------------
+
+ template <
+ typename T,
+ typename function_type
+ >
+ const T& any_cast(
+ const any_function<function_type>& a
+ ) { return a.cast_to<T>(); }
+ /*!
+ ensures
+ - returns a.cast_to<T>()
+ !*/
+
+// ----------------------------------------------------------------------------------------
+
+}
+
+#endif // DLIB_AnY_FUNCTION_ABSTRACT_H_
+