etl/include/etl/visitor.h
John Wellbelove 2a0b83408d Squashed commit of the following:
commit 70651fc29bb3eb8832d4dc7ba9aa24b16c0a1de3
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 19:24:46 2020 +0100

    CircleCI works

commit bdffb3635fe00b8089bd7afa6b8b689616d4abb1
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 19:08:17 2020 +0100

    Attempt at getting CircleCI to work

commit 3f3c1f1c23b8fb9ce43bd70f99bca33df82648c1
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 18:25:25 2020 +0100

    Attempt at getting CircleCI to work

commit 253c9b0171f38877ef6d62d8afa9f7dcb55bcc4a
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 18:21:03 2020 +0100

    Attempt at getting CircleCI to work

commit df730d4de5cec878bbf01b015d08fdf2d847497d
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 18:16:38 2020 +0100

    Attempt at getting CircleCI to work

commit 48d692ddd2701ad6c3145ef3251274f1df75853f
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 18:03:20 2020 +0100

    Attempt at getting CircleCI to work

commit 13a6a578046869cba60ef078c66c3c3edd88fa59
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:57:26 2020 +0100

    Attempt at getting CircleCI to work

commit 9bf22248d0bb9d802b616ae54257c62d47ec31e1
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:55:38 2020 +0100

    Attempt at getting CircleCI to work

commit da5cb68c97229e214ab0b737c8e48b48c777b842
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:51:17 2020 +0100

    Attempt at getting CircleCI to work

commit 94a59d4b9a9ceda22ba794c238c43ab8cf27d31c
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:40:30 2020 +0100

    Attempt at getting CircleCI to work

commit 07d17bfe01adb8ee4731dfa8d9f64216700a6324
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:38:46 2020 +0100

    Attempt at getting CircleCI to work

commit 4c9ae8a90ae7e785f618e95d484470d66c248477
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:33:13 2020 +0100

    Attempt at getting CircleCI to work

commit 72438721c15763790cbf55b1b8baf9c118924fdf
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:23:29 2020 +0100

    Attempt at getting CircleCI to work

commit 4ccc85ef071f4a5706a06a0cef6b6f166e672cd9
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:22:21 2020 +0100

    Attempt at getting CircleCI to work

commit 2a555f55b18eb56dd6a3e0e4dcbdc86ca8d47c1d
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:21:16 2020 +0100

    Attempt at getting CircleCI to work

commit a6c1c84aa9472f119bcf416c6cd6ebda611944ce
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:20:15 2020 +0100

    Attempt at getting CircleCI to work

commit ae535f3c79dfe1448327869e28f751eeac703744
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:18:31 2020 +0100

    Attempt at getting CircleCI to work

commit d34c6e46dacf38700dbe49ef716ca5455c5e4824
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:16:44 2020 +0100

    Attempt at getting CircleCI to work

commit 156ae5220c9781ea2fa5d8c07eadab47afd5b1c7
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 17:02:19 2020 +0100

    Attempt at getting CircleCI to work

commit 07c2910ded57185b946e9ff39795c90729ff8540
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 16:59:50 2020 +0100

    Attempt at getting CircleCI to work

commit 7ac59e5f2086e44bf3d22d9699670973d763eba2
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 16:54:57 2020 +0100

    Attempt at getting CircleCI to work

commit 12a5e406faf4186ec5c4357ecf50d7dfaf5b6b10
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 16:53:08 2020 +0100

    Attempt at getting CircleCI to work

commit e1c0294019dc680f973e6d7220d58cc4655c75c4
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 16:50:49 2020 +0100

    Attempt at getting CircleCI to work

commit 0e3537526b6df30d0b329144ad8f509f57a230dc
Merge: ebe0bb66 db1ed024
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 16:47:24 2020 +0100

    Merge branch 'development' into feature/add_circle-ci_support

commit ebe0bb6667322005387931cccbf064ee3a896569
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 14:55:33 2020 +0100

    Attempt at getting CircleCI to work

commit 8fc4565599c0d6937fb34016501a6d5408749f53
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 14:53:32 2020 +0100

    Attempt at getting CircleCI to work

commit 3793b591226459456c31f0b6bacfa65022abc977
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 14:44:44 2020 +0100

    Attempt at getting CircleCI to work

commit 6795d4132c55367e797b428be9cc33f4e3b05a44
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 12:59:58 2020 +0100

    Attempt at getting CircleCI to work

commit 9206209392251120407665e8778e25163c3d5796
Merge: d7ac41b9 638d6ac8
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Tue May 12 12:34:06 2020 +0100

    Merge branch 'development' into feature/add_circle-ci_support

    # Conflicts:
    #	include/etl/version.h
    #	library.json
    #	library.properties
    #	support/Release notes.txt
    #	test/test_make_string.cpp
    #	test/test_string_char.cpp
    #	test/vs2017/etl.vcxproj.filters

commit d7ac41b96c8529a74fb15cedfb69cad0ae8ba3c7
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 22:16:14 2019 +0000

    Removed artifacts path

commit af768e0cad2869cb46041e060cbd7e00c8b7f512
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 22:13:48 2019 +0000

    Added artifacts path

commit e0403d85ebe8ed8c28114361638ae889b67ce0d0
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 22:02:51 2019 +0000

    restore old CMakeLists.txt

commit 63cc9b6acdd2c4e143d29568d4fbde6795e82ea3
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 21:49:45 2019 +0000

    Added install git

commit 01bb5cb7b88d5fb9c21f75e9b40ceff7786cef29
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 21:46:46 2019 +0000

    Added install git

commit 42876cad96d2bff58957b2e41698fdf61c212f7f
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 21:43:19 2019 +0000

    Added install git

commit 3e5b19d30718fb91ba7daef3788cd51e70610ba0
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 21:39:39 2019 +0000

    Alternate CMakeLists.txt

commit f4ce6e75c8d9a03fc9784bf1ad48711727fc47ab
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 21:25:50 2019 +0000

    cat log file

commit 06983faf02621355690134aed70e73c2eae76c4e
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 21:16:31 2019 +0000

    Listing

commit f7670253bf97a29518843a6e329b1c6e3ffa1f8f
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 21:11:00 2019 +0000

    Touch config.yml file

commit bf167aa0303e3a89716098a95b0f3b9525e7cacd
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 21:05:01 2019 +0000

    Touch config.yml file

commit 5bca35821384c28bd93e3b993369365c36681e2f
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 20:20:57 2019 +0000

    Change image to ubuntu:latest

commit ad63db02c762f20d4bfd3ef10ca17f89e633c7e0
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 20:12:14 2019 +0000

    Touch config.yml file

commit 3f33be8ac03e572cd6dc2baca69a7d2a5c72e7ec
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 20:08:28 2019 +0000

    Touch config.yml file

commit 3bf0e93d4cb7b5f36097a502902cccb6cd1509e0
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 19:36:08 2019 +0000

    Update readme

commit 68653df3fe57d7a668b59bc7a6cefed43c01da2b
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 19:25:45 2019 +0000

    Fix readme

commit 12bfc61ed14f563a9aa7c6d5a8ff657932bab490
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 18:57:31 2019 +0000

    Touch config.yml file

commit 984534e89cad59675d1752768dada90a56b624f6
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 18:39:10 2019 +0000

    Added virtual destructors

commit 1d7f7bb44399a37433003320583bd39dc195ca51
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 18:21:08 2019 +0000

    Touch config.yml file

commit c66c5eb12204c1028d9071cd6e29e38722089760
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 14:34:11 2019 +0000

    Added master branch

commit d31ec7b7a674b19d9c30796f2676876017ef9450
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 14:14:15 2019 +0000

    Removed tabs

commit dad04c0a56abe25c5a4f2ecc9c79b569d4014f81
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 14:06:31 2019 +0000

    Removed tabs

commit a265c68fcb9abf622e3b4ab708b79a2b260f3863
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 14:03:58 2019 +0000

    Updated selected branch in config.yml

commit 7abf39b83d308dc7cc459bf27ad11f688197b11c
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 13:58:40 2019 +0000

    Updated selected branch in config.yml

commit 10f8d63cf2d926ee61dca691abce503ec5e08a4e
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 13:56:43 2019 +0000

    Updated selected branch in config.yml

commit e9db085677ad620e227800acc6fad2bee6f59456
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 13:52:42 2019 +0000

    Changed bin directory

commit 2dfff5b5c2c993ed14cc5fd7a936560faa6eedc0
Author: John Wellbelove <github@wellbelove.co.uk>
Date:   Fri Dec 6 13:50:56 2019 +0000

    Merge remote-tracking branch 'origin/master' into feature/add_circle-ci_support

    # Conflicts:
    #	include/etl/cstring.h
    #	include/etl/u16string.h
    #	include/etl/u32string.h
    #	include/etl/wstring.h
2020-05-12 19:41:13 +01:00

571 lines
18 KiB
C++

///\file
/******************************************************************************
The MIT License(MIT)
Embedded Template Library.
https://github.com/ETLCPP/etl
https://www.etlcpp.com
Copyright(c) 2014 jwellbelove
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
******************************************************************************/
#ifndef ETL_VISITOR_INCLUDED
#define ETL_VISITOR_INCLUDED
#include "platform.h"
//*****************************************************************************
///\defgroup visitor visitor
/// A set of template classes for easy implementation of the visitor pattern.<br>
/// The visitor design pattern is a way of separating an algorithm from an object
/// structure on which it operates. A practical result of this separation is the
/// ability to add new operations to existing object structures without modifying
/// those structures. It is one way to easily follow the open/closed principle.
/// In essence, the visitor allows one to add new virtual functions to a family
/// of classes without modifying the classes themselves; instead, one creates a
/// visitor class that implements all of the appropriate specialisations of the
/// virtual function. The visitor takes the instance as input, and implements
/// the goal through double dispatch.<br>
/// \ingroup patterns
//*****************************************************************************
namespace etl
{
#if ETL_CPP11_SUPPORTED && !defined(ETL_VISITOR_FORCE_CPP03)
//*****************************************************************
/// The visitable class for N types.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename... Types>
class visitable : public visitable<T1>, public visitable<Types...>
{
public:
using visitable<T1>::accept;
using visitable<Types...>::accept;
};
//*****************************************************************
/// The specialised visitable class for 1 type.
///\ingroup visitor
//*****************************************************************
template <typename T1>
class visitable<T1>
{
public:
virtual ~visitable() {}
virtual void accept(T1&) = 0;
};
#else
//*****************************************************************
/// The visitable base class for four visitor types.
/// Derive visitable classes from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2 = void, typename T3 = void, typename T4 = void>
class visitable
{
public:
virtual ~visitable() {}
virtual void accept(T1&) = 0;
virtual void accept(T2&) = 0;
virtual void accept(T3&) = 0;
virtual void accept(T4&) = 0;
};
//*****************************************************************
/// The visitable base class for three visitor types.
/// Derive visitable classes from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3>
class visitable<T1, T2, T3>
{
public:
virtual ~visitable() {}
virtual void accept(T1&) = 0;
virtual void accept(T2&) = 0;
virtual void accept(T3&) = 0;
};
//*****************************************************************
/// The visitable base class for two visitor types.
/// Derive visitable classes from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2>
class visitable<T1, T2>
{
public:
virtual ~visitable() {}
virtual void accept(T1&) = 0;
virtual void accept(T2&) = 0;
};
//*****************************************************************
/// The visitable base class for one visitor type.
/// Derive visitable classes from this.
///\ingroup visitor
//*****************************************************************
template <typename T1>
class visitable<T1>
{
public:
virtual ~visitable() {}
virtual void accept(T1&) = 0;
};
#endif
#if ETL_CPP11_SUPPORTED && !defined(ETL_VISITOR_FORCE_CPP03)
//*****************************************************************
/// The visitor class for N types.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename... Types>
class visitor : public visitor<T1>, public visitor<Types...>
{
public:
using visitor<T1>::visit;
using visitor<Types...>::visit;
};
//*****************************************************************
/// The specialised visitor class for 1 type.
///\ingroup visitor
//*****************************************************************
template <typename T1>
class visitor<T1>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
};
#else
//*****************************************************************
/// The visitor base class for sixteen types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2 = void, typename T3 = void, typename T4 = void,
typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void,
typename T9 = void, typename T10 = void, typename T11 = void, typename T12 = void,
typename T13 = void, typename T14 = void, typename T15 = void, typename T16 = void>
class visitor
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
virtual void visit(T9&) = 0;
virtual void visit(T10&) = 0;
virtual void visit(T11&) = 0;
virtual void visit(T12&) = 0;
virtual void visit(T13&) = 0;
virtual void visit(T14&) = 0;
virtual void visit(T15&) = 0;
virtual void visit(T16&) = 0;
};
//*****************************************************************
/// The visitor base class for fifteen types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8,
typename T9, typename T10, typename T11, typename T12,
typename T13, typename T14, typename T15>
class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
virtual void visit(T9&) = 0;
virtual void visit(T10&) = 0;
virtual void visit(T11&) = 0;
virtual void visit(T12&) = 0;
virtual void visit(T13&) = 0;
virtual void visit(T14&) = 0;
virtual void visit(T15&) = 0;
};
//*****************************************************************
/// The visitor base class for fourteen types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8,
typename T9, typename T10, typename T11, typename T12,
typename T13, typename T14>
class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
virtual void visit(T9&) = 0;
virtual void visit(T10&) = 0;
virtual void visit(T11&) = 0;
virtual void visit(T12&) = 0;
virtual void visit(T13&) = 0;
virtual void visit(T14&) = 0;
};
//*****************************************************************
/// The visitor base class for thirteen types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8,
typename T9, typename T10, typename T11, typename T12,
typename T13>
class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
virtual void visit(T9&) = 0;
virtual void visit(T10&) = 0;
virtual void visit(T11&) = 0;
virtual void visit(T12&) = 0;
virtual void visit(T13&) = 0;
};
//*****************************************************************
/// The visitor base class for twelve types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8,
typename T9, typename T10, typename T11, typename T12>
class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
virtual void visit(T9&) = 0;
virtual void visit(T10&) = 0;
virtual void visit(T11&) = 0;
virtual void visit(T12&) = 0;
};
//*****************************************************************
/// The visitor base class for eleven types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8,
typename T9, typename T10, typename T11>
class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
virtual void visit(T9&) = 0;
virtual void visit(T10&) = 0;
virtual void visit(T11&) = 0;
};
//*****************************************************************
/// The visitor base class for ten types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8,
typename T9, typename T10>
class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
virtual void visit(T9&) = 0;
virtual void visit(T10&) = 0;
};
//*****************************************************************
/// The visitor base class for nine types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8,
typename T9>
class visitor<T1, T2, T3, T4, T5, T6, T7, T8, T9>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
virtual void visit(T9&) = 0;
};
//*****************************************************************
/// The visitor base class for eight types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7, typename T8>
class visitor<T1, T2, T3, T4, T5, T6, T7, T8>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
virtual void visit(T8&) = 0;
};
//*****************************************************************
/// The visitor base class for seven types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6, typename T7>
class visitor<T1, T2, T3, T4, T5, T6, T7>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
virtual void visit(T7&) = 0;
};
//*****************************************************************
/// The visitor base class for six types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5, typename T6>
class visitor<T1, T2, T3, T4, T5, T6>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
virtual void visit(T6&) = 0;
};
//*****************************************************************
/// The visitor base class for five types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4,
typename T5>
class visitor<T1, T2, T3, T4, T5>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
virtual void visit(T5&) = 0;
};
//*****************************************************************
/// The visitor base class for four types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3, typename T4>
class visitor<T1, T2, T3, T4>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
virtual void visit(T4&) = 0;
};
//*****************************************************************
/// The visitor base class for three types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2, typename T3>
class visitor<T1, T2, T3>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
virtual void visit(T3&) = 0;
};
//*****************************************************************
/// The visitor base class for two types.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1, typename T2>
class visitor<T1, T2>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
virtual void visit(T2&) = 0;
};
//*****************************************************************
/// The visitor base class for one type.
/// Derive visitors from this.
///\ingroup visitor
//*****************************************************************
template <typename T1>
class visitor<T1>
{
public:
virtual ~visitor() {}
virtual void visit(T1&) = 0;
};
#endif
}
#endif