add an type-list facility inspired by Loki
This commit is contained in:
parent
9aa3cc11e8
commit
bf93301211
4 changed files with 235 additions and 0 deletions
8
AUTHORS
8
AUTHORS
|
|
@ -48,3 +48,11 @@ The Loki Library
|
||||||
"Modern C++ Design: Generic Programming and Design
|
"Modern C++ Design: Generic Programming and Design
|
||||||
Patterns Applied". Copyright (c) 2001. Addison-Wesley.
|
Patterns Applied". Copyright (c) 2001. Addison-Wesley.
|
||||||
ISBN 0201704315
|
ISBN 0201704315
|
||||||
|
|
||||||
|
Loki Copyright Notice:
|
||||||
|
Permission to use, copy, modify, distribute and sell this software for any
|
||||||
|
purpose is hereby granted without fee, provided that the above copyright
|
||||||
|
notice appear in all copies and that both that copyright notice and this
|
||||||
|
permission notice appear in supporting documentation.
|
||||||
|
The author makes no representations about the suitability of this software
|
||||||
|
for any purpose. It is provided "as is" without express or implied warranty.
|
||||||
|
|
|
||||||
120
src/common/typelist.hpp
Normal file
120
src/common/typelist.hpp
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
/*
|
||||||
|
TYPELIST.hpp - typelist meta programming facilities
|
||||||
|
|
||||||
|
Copyright (C) CinelerraCV
|
||||||
|
2007, Hermann Vosseler <Ichthyostega@web.de>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
====================================================================
|
||||||
|
This code is heavily inspired by
|
||||||
|
The Loki Library (loki-lib/trunk/include/loki/Singleton.h)
|
||||||
|
Copyright (c) 2001 by Andrei Alexandrescu
|
||||||
|
Copyright (c) 2005 by Peter Kümmel
|
||||||
|
This Loki code accompanies the book:
|
||||||
|
Alexandrescu, Andrei. "Modern C++ Design: Generic Programming
|
||||||
|
and Design Patterns Applied".
|
||||||
|
Copyright (c) 2001. Addison-Wesley. ISBN 0201704315
|
||||||
|
|
||||||
|
Loki Copyright Notice:
|
||||||
|
Permission to use, copy, modify, distribute and sell this software for any
|
||||||
|
purpose is hereby granted without fee, provided that the above copyright
|
||||||
|
notice appear in all copies and that both that copyright notice and this
|
||||||
|
permission notice appear in supporting documentation.
|
||||||
|
The author makes no representations about the suitability of this software
|
||||||
|
for any purpose. It is provided "as is" without express or implied warranty.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/** @file typelist.hpp
|
||||||
|
** A template metaprogramming technique for manipulating collections of types.
|
||||||
|
** Effectively this is a taylored and simplified version of what can be found in the Loki library.
|
||||||
|
** We use it in other generic library-style code to generate repetitive code. If you tend to find
|
||||||
|
** template metaprogramming (or functional programming in general) offending, please ignore the
|
||||||
|
** technical details and just consider the benefit of such an simplification for the user code.
|
||||||
|
**
|
||||||
|
** Interface for using this facility is the template Types(.....) for up to 20 Type parameters
|
||||||
|
**
|
||||||
|
** @see cinelerra::visitor::Applicable usage example
|
||||||
|
** @see typelisttest.cpp
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CINELERRA_TYPELIST_H
|
||||||
|
#define CINELERRA_TYPELIST_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace cinelerra
|
||||||
|
{
|
||||||
|
namespace typelist
|
||||||
|
{
|
||||||
|
|
||||||
|
class NullType { };
|
||||||
|
|
||||||
|
template<class H, class T>
|
||||||
|
struct Node
|
||||||
|
{
|
||||||
|
typedef H Head;
|
||||||
|
typedef T Tail;
|
||||||
|
};
|
||||||
|
|
||||||
|
template
|
||||||
|
< class T01=NullType
|
||||||
|
, class T02=NullType
|
||||||
|
, class T03=NullType
|
||||||
|
, class T04=NullType
|
||||||
|
, class T05=NullType
|
||||||
|
, class T06=NullType
|
||||||
|
, class T07=NullType
|
||||||
|
, class T08=NullType
|
||||||
|
, class T09=NullType
|
||||||
|
, class T10=NullType
|
||||||
|
, class T11=NullType
|
||||||
|
, class T12=NullType
|
||||||
|
, class T13=NullType
|
||||||
|
, class T14=NullType
|
||||||
|
, class T15=NullType
|
||||||
|
, class T16=NullType
|
||||||
|
, class T17=NullType
|
||||||
|
, class T18=NullType
|
||||||
|
, class T19=NullType
|
||||||
|
, class T20=NullType
|
||||||
|
>
|
||||||
|
class Types
|
||||||
|
{
|
||||||
|
typedef typename Types< T02, T03, T04
|
||||||
|
, T05, T06, T07, T08
|
||||||
|
, T09, T10, T11, T12
|
||||||
|
, T13, T14, T15, T16
|
||||||
|
, T17, T18, T19, T20>::List ListTail;
|
||||||
|
public:
|
||||||
|
typedef Node<T01, ListTail> List;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct Types<>
|
||||||
|
{
|
||||||
|
typedef NullType List;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace typelist
|
||||||
|
|
||||||
|
} // namespace cinelerra
|
||||||
|
#endif
|
||||||
|
|
@ -182,6 +182,13 @@ out: --> remaining=SingleTestID spam --eggs
|
||||||
END
|
END
|
||||||
|
|
||||||
|
|
||||||
|
TEST "TypeList_test" TypeList_test <<END
|
||||||
|
out: - 1 -- 2 -- 3 -- 5 -- 8 -- 13 -- The End -
|
||||||
|
out: ..Size of = 1
|
||||||
|
return: 0
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
TEST "VisitingTool_test" VisitingTool_test <<END
|
TEST "VisitingTool_test" VisitingTool_test <<END
|
||||||
out: === Babbler meets Boss and BigBoss ===
|
out: === Babbler meets Boss and BigBoss ===
|
||||||
out: Hello Boss, nice to meet you...
|
out: Hello Boss, nice to meet you...
|
||||||
|
|
|
||||||
100
tests/components/common/typelisttest.cpp
Normal file
100
tests/components/common/typelisttest.cpp
Normal file
|
|
@ -0,0 +1,100 @@
|
||||||
|
/*
|
||||||
|
TypeList(Test) - check the typelist metaprogramming facility
|
||||||
|
|
||||||
|
Copyright (C) CinelerraCV
|
||||||
|
2007, Hermann Vosseler <Ichthyostega@web.de>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
* *****************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#include "common/test/run.hpp"
|
||||||
|
#include "common/typelist.hpp"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
using std::cout;
|
||||||
|
|
||||||
|
|
||||||
|
namespace cinelerra
|
||||||
|
{
|
||||||
|
namespace typelist
|
||||||
|
{
|
||||||
|
namespace test
|
||||||
|
{
|
||||||
|
|
||||||
|
template<int I>
|
||||||
|
struct Block
|
||||||
|
{
|
||||||
|
Block() { cout << "- "<<I<<" -"; }
|
||||||
|
};
|
||||||
|
struct Zero
|
||||||
|
{
|
||||||
|
Zero() { cout << "- The End -"; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
typedef Types< Block<1>
|
||||||
|
, Block<2>
|
||||||
|
, Block<3>
|
||||||
|
, Block<5>
|
||||||
|
, Block<8>
|
||||||
|
, Block<13>
|
||||||
|
>::List TheList;
|
||||||
|
|
||||||
|
|
||||||
|
template<class X, class P>
|
||||||
|
class Chain
|
||||||
|
: X, P
|
||||||
|
{ }
|
||||||
|
;
|
||||||
|
template<class H, class T, class P>
|
||||||
|
class Chain<Node<H,T>, P>
|
||||||
|
: H, Chain<T,P>
|
||||||
|
{ }
|
||||||
|
;
|
||||||
|
|
||||||
|
typedef Chain<TheList,Zero> AssembledClass;
|
||||||
|
|
||||||
|
/*************************************************************************
|
||||||
|
* @test try out Loki-style typelist metaprogramming.
|
||||||
|
* Assembles a Class definition from parts specified as collection
|
||||||
|
* of types. The elementary building block has an talking ctor, so
|
||||||
|
* by automatic ctor chaining we get a message of each part.
|
||||||
|
*/
|
||||||
|
class TypeList_test : public Test
|
||||||
|
{
|
||||||
|
virtual void run(Arg arg)
|
||||||
|
{
|
||||||
|
AssembledClass wow_me_has_numbers;
|
||||||
|
|
||||||
|
cout << "\n..Size of = "
|
||||||
|
<< sizeof(wow_me_has_numbers) <<"\n";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Register this test class... */
|
||||||
|
LAUNCHER (TypeList_test, "unit common");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace test
|
||||||
|
|
||||||
|
} // namespace typelist
|
||||||
|
|
||||||
|
} // namespace cinelerra
|
||||||
Loading…
Reference in a new issue