dlib C++ Library - any_function.cpp

// Copyright (C) 2011 Davis E. King (davis@dlib.net)
// License: Boost Software License See LICENSE.txt for the full license.
#include <dlib/any.h>
#include <sstream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <vector>
#include "../rand.h"
#include "tester.h"
namespace 
{
 using namespace test;
 using namespace dlib;
 using namespace std;
 logger dlog("test.any_function");
// ----------------------------------------------------------------------------------------
 int add ( int a, int b) { return a + b; }
 string cat ( string a, string b) { return a + b; }
// ----------------------------------------------------------------------------------------
 void set_vals1( int& a) { a = 1; }
 void set_vals2( int& a, int& b) { a = 1; b = 2; }
 void set_vals3( int& a, int& b, int& c) { a = 1; b = 2; c = 3; }
 void set_vals4( int& a, int& b, int& c, int& d) { a = 1; b = 2; c = 3; d = 4; }
 void set_vals5( int& a, int& b, int& c, int& d, int& e) { a = 1; b = 2; c = 3; d = 4; e = 5; }
 void set_vals6( int& a, int& b, int& c, int& d, int& e, int& f) { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; }
 void set_vals7( int& a, int& b, int& c, int& d, int& e, int& f, int& g) { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; }
 void set_vals8( int& a, int& b, int& c, int& d, int& e, int& f, int& g, int& h) 
 { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; h = 8; }
 void set_vals9( int& a, int& b, int& c, int& d, int& e, int& f, int& g, int& h, int& i) 
 { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; h = 8; i = 9;}
 void set_vals10( int& a, int& b, int& c, int& d, int& e, int& f, int& g, int& h, int& i, int& j) 
 { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; h = 8; i = 9; j = 10;}
 void zero_vals( int& a, int& b, int& c, int& d, int& e, int& f, int& g, int& h, int& i, int& j) 
 { a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; g = 0; h = 0; i = 0; j = 0;}
// ----------------------------------------------------------------------------------------
 struct test
 {
 int operator()() const { return 4; }
 };
 struct test2
 {
 int v;
 test2() : v(0) {}
 test2(int val) : v(val) {}
 int operator()() const { return v; }
 };
// ----------------------------------------------------------------------------------------
 void test_contains_4(
 const any_function<int()> a
 )
 {
 DLIB_TEST(a.is_empty() == false);
 DLIB_TEST(a.is_set() == true);
 DLIB_TEST(a.contains<test>() == true);
 DLIB_TEST(a.contains<int(*)()>() == false);
 DLIB_TEST(any_cast<test>(a)() == 4);
 DLIB_TEST(a() == 4);
 }
// ----------------------------------------------------------------------------------------
 void run_test()
 {
 any_function<int()> a, b, c;
 DLIB_TEST(a.is_empty());
 DLIB_TEST(a.is_set()==false);
 DLIB_TEST(a.contains<int(*)()>() == false);
 DLIB_TEST(a.contains<test>() == false);
 DLIB_TEST(a.is_empty());
 a = b;
 swap(a,b);
 a.swap(b);
 a = test();
 test_contains_4(a);
 bool error = false;
 try
 {
 any_cast<int(*)()>(a);
 }
 catch (bad_any_cast&)
 {
 error = true;
 }
 DLIB_TEST(error);
 swap(a,b);
 test_contains_4(b);
 DLIB_TEST(a.is_empty());
 a = b;
 test_contains_4(a);
 c.get<test2>() = test2(10);
 DLIB_TEST(c.get<test2>().v == 10); 
 a = c;
 DLIB_TEST(a.cast_to<test2>().v == 10); 
 a.clear();
 DLIB_TEST(a.is_empty());
 error = false;
 try
 {
 any_cast<test>(a);
 }
 catch (bad_any_cast&)
 {
 error = true;
 }
 DLIB_TEST(error);
 }
// ----------------------------------------------------------------------------------------
 void run_test2()
 {
 any_function<int(int,int)> f = &add;
 DLIB_TEST(f(1,3) == 4);
 any_function<string(string,string)> g(&cat);
 DLIB_TEST(g("one", "two") == "onetwo");
 }
// ----------------------------------------------------------------------------------------
 void run_test3()
 {
 any_function<void(int&)> f1;
 any_function<void(int&,int&)> f2;
 any_function<void(int&,int&,int&)> f3;
 any_function<void(int&,int&,int&,int&)> f4;
 any_function<void(int&,int&,int&,int&,int&)> f5;
 any_function<void(int&,int&,int&,int&,int&,int&)> f6;
 any_function<void(int&,int&,int&,int&,int&,int&,int&)> f7;
 any_function<void(int&,int&,int&,int&,int&,int&,int&,int&)> f8;
 any_function<void(int&,int&,int&,int&,int&,int&,int&,int&,int&)> f9;
 any_function<void(int&,int&,int&,int&,int&,int&,int&,int&,int&,int&)> f10;
 f1 = set_vals1;
 f2 = set_vals2;
 f3 = set_vals3;
 f4 = set_vals4;
 f5 = set_vals5;
 f6 = set_vals6;
 f7 = set_vals7;
 f8 = set_vals8;
 f9 = set_vals9;
 f10 = set_vals10;
 int a,b,c,d,e,f,g,h,i,j;
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f1(a);
 DLIB_TEST(a==1);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f2(a,b);
 DLIB_TEST(a==1 && b==2);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f3(a,b,c);
 DLIB_TEST(a==1 && b==2 && c==3);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f4(a,b,c,d);
 DLIB_TEST(a==1 && b==2 && c==3 && d==4);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f5(a,b,c,d,e);
 DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f6(a,b,c,d,e,f);
 DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f7(a,b,c,d,e,f,g);
 DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6 && g==7);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f8(a,b,c,d,e,f,g,h);
 DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6 && g==7 && h==8);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 f9(a,b,c,d,e,f,g,h,i);
 DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6 && g==7 && h==8 && i==9);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 
 f10(a,b,c,d,e,f,g,h,i,j);
 DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6 && g==7 && h==8 && i==9 && j==10);
 zero_vals(a,b,c,d,e,f,g,h,i,j);
 }
// ----------------------------------------------------------------------------------------
 class test_any_function : public tester
 {
 public:
 test_any_function (
 ) :
 tester ("test_any_function",
 "Runs tests on the any_function component.")
 {}
 void perform_test (
 )
 {
 print_spinner();
 run_test();
 print_spinner();
 run_test2();
 print_spinner();
 run_test3();
 }
 } a;
}

AltStyle によって変換されたページ (->オリジナル) /