feat():initial version

This commit is contained in:
2026-06-09 20:16:47 +08:00
commit 85fbb3188c
14809 changed files with 3044607 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
// (C) Copyright Edward Diener 2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ARRAY_HPP)
#define BOOST_VMD_ARRAY_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
#include <boost/vmd/array/to_seq.hpp>
#include <boost/vmd/array/to_tuple.hpp>
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ARRAY_HPP */

View File

@@ -0,0 +1,49 @@
// (C) Copyright Edward Diener 2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ARRAY_TO_SEQ_HPP)
#define BOOST_VMD_ARRAY_TO_SEQ_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/array/to_seq.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/is_empty_array.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ARRAY_TO_SEQ(array)
\brief converts an array to a seq.
array = array to be converted.
If the array is an array of 0 elements it is converted to an empty seq.
Otherwise the array is converted to a seq with the same number of elements as the array.
*/
#define BOOST_VMD_ARRAY_TO_SEQ(array) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY_ARRAY(array), \
BOOST_VMD_EMPTY, \
BOOST_PP_ARRAY_TO_SEQ \
) \
(array) \
/**/
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ARRAY_TO_SEQ_HPP */

View File

@@ -0,0 +1,49 @@
// (C) Copyright Edward Diener 2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ARRAY_TO_TUPLE_HPP)
#define BOOST_VMD_ARRAY_TO_TUPLE_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/array/to_tuple.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/is_empty_array.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ARRAY_TO_TUPLE(array)
\brief converts an array to a tuple.
array = array to be converted.
If the array is an array of 0 elements it is converted to an empty tuple.
Otherwise the array is converted to a tuple with the same number of elements as the array.
*/
#define BOOST_VMD_ARRAY_TO_TUPLE(array) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY_ARRAY(array), \
BOOST_VMD_EMPTY, \
BOOST_PP_ARRAY_TO_TUPLE \
) \
(array) \
/**/
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ARRAY_TO_TUPLE_HPP */

View File

@@ -0,0 +1,62 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_HPP)
#define BOOST_VMD_ASSERT_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
#include <boost/vmd/detail/assert.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT(...)
\brief Conditionally causes an error to be generated.
... = variadic parameters, maximum of 2 will be considered.
Any variadic parameters beyond the maximum of 2 are just ignored.
The first variadic parameter is:
cond = A condition that determines whether an assertion occurs. Valid values range from 0 to BOOST_PP_LIMIT_MAG.
The second variadic parameter (optional) is:
errstr = An error string for generating a compiler error when using the VC++ compiler.
The VC++ compiler is incapable of producing a preprocessor error so when the 'cond'
is 0, a compiler error is generated by outputting C++ code in the form of:
@code
typedef char errstr[-1];
@endcode
The errstr defaults to BOOST_VMD_ASSERT_ERROR if not supplied.
It is only relevant for VC++.
returns = If cond expands to 0, this macro causes an error. Otherwise, it expands to nothing.
For all compilers other than Visual C++ the error is a preprocessing error.
For Visual C++ the error is caused by output invalid C++: this error could be
masked if the invalid output is ignored by a macro which invokes this macro.
*/
# define BOOST_VMD_ASSERT(...) \
BOOST_VMD_DETAIL_ASSERT(__VA_ARGS__) \
/**/
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_HPP */

View File

@@ -0,0 +1,121 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_IS_ARRAY_HPP)
#define BOOST_VMD_ASSERT_IS_ARRAY_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT_IS_ARRAY(sequence)
\brief Asserts that the sequence is a Boost PP array.
The macro checks that the sequence is a Boost PP array.
If it is not a Boost PP array, it forces a compiler error.
The macro normally checks for a Boost PP array only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
sequence = a possible Boost PP array.
@code
returns = Normally the macro returns nothing.
If the sequence is a Boost PP array, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a Boost PP array the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not a
Boost PP array.
@endcode
*/
/** \def BOOST_VMD_ASSERT_IS_ARRAY_D(d,sequence)
\brief Asserts that the sequence is a Boost PP array. Re-entrant version.
The macro checks that the sequence is a Boost PP array.
If it is not a Boost PP array, it forces a compiler error.
The macro normally checks for a Boost PP array only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
d = The next available BOOST_PP_WHILE iteration. <br/>
sequence = a possible Boost PP sequence.
@code
returns = Normally the macro returns nothing.
If the sequence is a Boost PP array, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a Boost PP array the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not a
Boost PP array.
@endcode
*/
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_ARRAY(sequence)
#define BOOST_VMD_ASSERT_IS_ARRAY_D(d,sequence)
#else
#include <boost/vmd/is_array.hpp>
#include <boost/vmd/assert.hpp>
#define BOOST_VMD_ASSERT_IS_ARRAY(sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_ARRAY(sequence), \
BOOST_VMD_IS_ARRAY_ASSERT_ERROR \
) \
/**/
#define BOOST_VMD_ASSERT_IS_ARRAY_D(d,sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_ARRAY_D(d,sequence), \
BOOST_VMD_IS_ARRAY_ASSERT_ERROR \
) \
/**/
#endif /* !BOOST_VMD_ASSERT_DATA */
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_IS_ARRAY_HPP */

View File

@@ -0,0 +1,109 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_IS_EMPTY_HPP)
#define BOOST_VMD_ASSERT_IS_EMPTY_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
#if BOOST_VMD_ASSERT_DATA
#include <boost/vmd/assert.hpp>
#include <boost/vmd/is_empty.hpp>
#endif
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT_IS_EMPTY(...)
\brief Asserts that the input is empty.
The macro checks to see if the input is empty or not.
If it is not empty, it forces a compiler error.
The macro is a variadic macro taking any input.
For the VC++8 compiler (VS2005) the macro takes a single parameter of input to check and not variadic data.
The macro normally checks for emptiness only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
.... = variadic input, for VC++8 this must be a single parameter.
@code
returns = Normally the macro returns nothing.
If the input is empty, nothing is output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the input is not empty the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the input is not empty.
@endcode
It is recommended to append BOOST_PP_EMPTY() to whatever input
is being tested in order to avoid possible warning messages
from some compilers about no parameters being passed to the macro
when the input is truly empty.
*/
#if BOOST_VMD_MSVC_V8
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_EMPTY(input)
#else
#define BOOST_VMD_ASSERT_IS_EMPTY(input) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_EMPTY(input), \
BOOST_VMD_IS_EMPTY_ASSERT_ERROR \
) \
/**/
#endif // !BOOST_VMD_ASSERT_DATA
#else
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_EMPTY(...)
#else
#define BOOST_VMD_ASSERT_IS_EMPTY(...) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_EMPTY(__VA_ARGS__), \
BOOST_VMD_IS_EMPTY_ASSERT_ERROR \
) \
/**/
#endif // !BOOST_VMD_ASSERT_DATA
#endif /* BOOST_VMD_MSVC_V8 */
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_IS_EMPTY_HPP */

View File

@@ -0,0 +1,182 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_IS_IDENTIFIER_HPP)
#define BOOST_VMD_ASSERT_IS_IDENTIFIER_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT_IS_IDENTIFIER(...)
\brief Asserts that the sequence is an identifier.
The macro checks that the sequence is an identifier.
If it is not an identifier, it forces a compiler error.
The macro normally checks for an identifier only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
... = variadic parameters
The variadic parameters are:
sequence = A sequence to test as an identifier. <br/>
ids (optional) = The data may take one of two forms:
it is either one or more single identifiers
or a single Boost PP tuple of identifiers.
@code
returns = Normally the macro returns nothing.
If the sequence is an identifier, nothing is
output. If optional ids are specified, for the
sequence to be an identifier it must be an
identifier that matches one of the optional
ids.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not an identifier the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not an
identifier.
@endcode
Identifiers are registered in VMD with:
@code
#define BOOST_VMD_REG_XXX (XXX) where XXX is a v-identifier.
@endcode
The identifier must be registered to be found.
Identifiers are pre-detected in VMD with:
@code
#define BOOST_VMD_DETECT_XXX_XXX where XXX is an identifier.
@endcode
If you specify optional ids and have not specified the detection
of an optional id, that id will never match an identifier.
*/
/** \def BOOST_VMD_ASSERT_IS_IDENTIFIER_D(d,...)
\brief Asserts that the sequence is an identifier. Re-entrant version.
The macro checks that the sequence is an identifier.
If it is not an identifier, it forces a compiler error.
The macro normally checks for an identifier only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
d = The next available BOOST_PP_WHILE iteration. <br/>
... = variadic parameters
The variadic parameters are:
sequence = A sequence to test as an identifier. <br/>
ids (optional) = The data may take one of two forms:
it is either one or more single identifiers
or a single Boost PP tuple of identifiers.
@code
returns = Normally the macro returns nothing.
If the sequence is an identifier, nothing is
output. If optional ids are specified, for the
sequence to be an identifier it must be an
identifier that matches one of the optional
ids.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not an identifier the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not an
identifier.
@endcode
Identifiers are registered in VMD with:
@code
#define BOOST_VMD_REG_XXX (XXX) where XXX is a v-identifier.
@endcode
The identifier must be registered to be found.
Identifiers are pre-detected in VMD with:
@code
#define BOOST_VMD_DETECT_XXX_XXX where XXX is an identifier.
@endcode
If you specify optional ids and have not specified the detection
of an optional id, that id will never match an identifier.
*/
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_IDENTIFIER(...)
#define BOOST_VMD_ASSERT_IS_IDENTIFIER_D(d,...)
#else
#include <boost/vmd/assert.hpp>
#include <boost/vmd/is_identifier.hpp>
#define BOOST_VMD_ASSERT_IS_IDENTIFIER(...) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_IDENTIFIER(__VA_ARGS__), \
BOOST_VMD_IDENTIFIER_ASSERT_ERROR \
) \
/**/
#define BOOST_VMD_ASSERT_IS_IDENTIFIER_D(d,...) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_IDENTIFIER_D(d,__VA_ARGS__), \
BOOST_VMD_IDENTIFIER_ASSERT_ERROR \
) \
/**/
#endif // !BOOST_VMD_ASSERT_DATA
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_IS_IDENTIFIER_HPP */

View File

@@ -0,0 +1,121 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_IS_LIST_HPP)
#define BOOST_VMD_ASSERT_IS_LIST_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT_IS_LIST(sequence)
\brief Asserts that the sequence is a Boost PP list.
The macro checks that the sequence is a Boost PP list.
If it is not a Boost PP list, it forces a compiler error.
The macro normally checks for a Boost PP list only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
sequence = a possible Boost PP list.
@code
returns = Normally the macro returns nothing.
If the sequence is a Boost PP list, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a Boost PP list the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the parameter is not a
Boost PP list.
@endcode
*/
/** \def BOOST_VMD_ASSERT_IS_LIST_D(d,sequence)
\brief Asserts that the sequence is a Boost PP list. Re-entrant version.
The macro checks that the sequence is a Boost PP list.
If it is not a Boost PP list, it forces a compiler error.
The macro normally checks for a Boost PP list only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
d = The next available BOOST_PP_WHILE iteration. <br/>
sequence = a possible Boost PP list.
@code
returns = Normally the macro returns nothing.
If the sequence is a Boost PP list, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a Boost PP list the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the parameter is not a
Boost PP list.
@endcode
*/
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_LIST(sequence)
#define BOOST_VMD_ASSERT_IS_LIST_D(d,sequence)
#else
#include <boost/vmd/assert.hpp>
#include <boost/vmd/is_list.hpp>
#define BOOST_VMD_ASSERT_IS_LIST(sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_LIST(sequence), \
BOOST_VMD_ASSERT_IS_LIST_ERROR \
) \
/**/
#define BOOST_VMD_ASSERT_IS_LIST_D(d,sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_LIST_D(d,sequence), \
BOOST_VMD_ASSERT_IS_LIST_ERROR \
) \
/**/
#endif /* BOOST_VMD_ASSERT_DATA */
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_IS_LIST_HPP */

View File

@@ -0,0 +1,77 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_IS_NUMBER_HPP)
#define BOOST_VMD_ASSERT_IS_NUMBER_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT_IS_NUMBER(sequence)
\brief Asserts that the sequence is a number.
The macro checks that the parameter is a number.
If it is not a number, it forces a compiler error.
The macro normally checks for a number only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
sequence = a possible number.
@code
returns = Normally the macro returns nothing.
If the sequence is a number, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a number the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not a
number.
@endcode
*/
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_NUMBER(sequence)
#else
#include <boost/vmd/assert.hpp>
#include <boost/vmd/is_number.hpp>
#define BOOST_VMD_ASSERT_IS_NUMBER(sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_NUMBER(sequence), \
BOOST_VMD_IS_NUMBER_ASSERT_ERROR \
) \
/**/
#endif // !BOOST_VMD_ASSERT_DATA
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_IS_NUMBER_HPP */

View File

@@ -0,0 +1,121 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_IS_SEQ_HPP)
#define BOOST_VMD_ASSERT_IS_SEQ_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT_IS_SEQ(sequence)
\brief Asserts that the sequence is a Boost PP seq.
The macro checks that the sequence is a Boost PP seq.
If it is not a Boost PP seq, it forces a compiler error.
The macro normally checks for a Boost PP seq only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
sequence = a possible Boost PP seq.
@code
returns = Normally the macro returns nothing.
If the sequence is a Boost PP seq, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a Boost PP seq the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not a
Boost PP seq.
@endcode
*/
/** \def BOOST_VMD_ASSERT_IS_SEQ_D(d,sequence)
\brief Asserts that the sequence is a Boost PP seq. Re-entrant version.
The macro checks that the sequence is a Boost PP seq.
If it is not a Boost PP seq, it forces a compiler error.
The macro normally checks for a Boost PP seq only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
d = The next available BOOST_PP_WHILE iteration. <br/>
sequence = a possible Boost PP seq.
@code
returns = Normally the macro returns nothing.
If the sequence is a Boost PP seq, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a Boost PP seq the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not a
Boost PP seq.
@endcode
*/
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_SEQ(sequence)
#define BOOST_VMD_ASSERT_IS_SEQ_D(d,sequence)
#else
#include <boost/vmd/assert.hpp>
#include <boost/vmd/is_seq.hpp>
#define BOOST_VMD_ASSERT_IS_SEQ(sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_SEQ(sequence), \
BOOST_VMD_ASSERT_IS_SEQ_ERROR \
) \
/**/
#define BOOST_VMD_ASSERT_IS_SEQ_D(d,sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_SEQ_D(d,sequence), \
BOOST_VMD_ASSERT_IS_SEQ_ERROR \
) \
/**/
#endif /* BOOST_VMD_ASSERT_DATA */
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_IS_SEQ_HPP */

View File

@@ -0,0 +1,77 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_IS_TUPLE_HPP)
#define BOOST_VMD_ASSERT_IS_TUPLE_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT_IS_TUPLE(sequence)
\brief Asserts that the sequence is a Boost PP tuple.
The macro checks that the sequence is a Boost PP tuple.
If it is not a Boost PP tuple, it forces a compiler error.
The macro normally checks for a Boost PP tuple only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
sequence = a possible Boost PP tuple.
@code
returns = Normally the macro returns nothing.
If the sequence is a Boost PP tuple, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a Boost PP tuple the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not a
Boost PP tuple.
@endcode
*/
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_TUPLE(sequence)
#else
#include <boost/vmd/assert.hpp>
#include <boost/vmd/is_tuple.hpp>
#define BOOST_VMD_ASSERT_IS_TUPLE(sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_TUPLE(sequence), \
BOOST_VMD_ASSERT_IS_TUPLE_ERROR \
) \
/**/
#endif /* BOOST_VMD_ASSERT_DATA */
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_IS_TUPLE_HPP */

View File

@@ -0,0 +1,121 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_ASSERT_IS_TYPE_HPP)
#define BOOST_VMD_ASSERT_IS_TYPE_HPP
#include <boost/vmd/detail/setup.hpp>
#if BOOST_PP_VARIADICS
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/** \def BOOST_VMD_ASSERT_IS_TYPE(sequence)
\brief Asserts that the sequence is a VMD type.
The macro checks that the sequence is a VMD type.
If it is not a VMD type, it forces a compiler error.
The macro normally checks for a VMD type only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
sequence = a possible VMD type.
@code
returns = Normally the macro returns nothing.
If the sequence is a VMD type, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a VMD type the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not a
VMD type.
@endcode
*/
/** \def BOOST_VMD_ASSERT_IS_TYPE_D(d,sequence)
\brief Asserts that the sequence is a VMD type. Re-entrant version.
The macro checks that the sequence is a VMD type.
If it is not a VMD type, it forces a compiler error.
The macro normally checks for a VMD type only in
debug mode. However an end-user can force the macro
to check or not check by defining the macro
BOOST_VMD_ASSERT_DATA to 1 or 0 respectively.
d = The next available BOOST_PP_WHILE iteration. <br/>
sequence = a possible VMD type.
@code
returns = Normally the macro returns nothing.
If the sequence is a VMD type, nothing is
output.
For VC++, because there is no sure way of forcing
a compiler error from within a macro without producing
output, if the sequence is not a VMD type the
macro forces a compiler error by outputting invalid C++.
For all other compilers a compiler error is forced
without producing output if the sequence is not a
VMD type.
@endcode
*/
#if !BOOST_VMD_ASSERT_DATA
#define BOOST_VMD_ASSERT_IS_TYPE(sequence)
#define BOOST_VMD_ASSERT_IS_TYPE_D(d,sequence)
#else
#include <boost/vmd/assert.hpp>
#include <boost/vmd/is_type.hpp>
#define BOOST_VMD_ASSERT_IS_TYPE(sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_TYPE(sequence), \
BOOST_VMD_IS_TYPE_ASSERT_ERROR \
) \
/**/
#define BOOST_VMD_ASSERT_IS_TYPE_D(d,sequence) \
BOOST_VMD_ASSERT \
( \
BOOST_VMD_IS_TYPE_D(d,sequence), \
BOOST_VMD_IS_TYPE_ASSERT_ERROR \
) \
/**/
#endif // !BOOST_VMD_ASSERT_DATA
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_ASSERT_IS_TYPE_HPP */

View File

@@ -0,0 +1,97 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_HPP)
#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/detail/equal_type.hpp>
#include <boost/vmd/detail/is_array_common.hpp>
#include <boost/vmd/detail/is_list.hpp>
#include <boost/vmd/detail/type_registration.hpp>
#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY(data,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(data), \
BOOST_VMD_TYPE_ARRAY, \
type \
) \
/**/
#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY_D(d,data,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,data), \
BOOST_VMD_TYPE_ARRAY, \
type \
) \
/**/
#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST(data,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_LIST_WLOOP(data), \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY \
) \
(data,type) \
) \
/**/
#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST_D(d,data,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_LIST_WLOOP_D(d,data), \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY_D \
) \
(d,data,type) \
) \
/**/
/*
Input is any VMD data and a VMD type for that data
If the type is a tuple, checks to see if it is a more specific
type and, if it is, returns that type,
otherwise returns the type passed as a parameter
*/
#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(data,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(BOOST_VMD_TYPE_TUPLE,type), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST, \
BOOST_VMD_IDENTITY(type) \
) \
(data,type) \
) \
/**/
#define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,data,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,BOOST_VMD_TYPE_TUPLE,type), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST_D, \
BOOST_VMD_IDENTITY(type) \
) \
(d,data,type) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_HPP */

View File

@@ -0,0 +1,189 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_ARRAY_HPP)
#define BOOST_VMD_DETAIL_ARRAY_HPP
#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/empty_result.hpp>
#include <boost/vmd/detail/is_array_common.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/tuple.hpp>
#define BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY(tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX \
( \
BOOST_PP_TUPLE_ELEM \
( \
0, \
tuple \
) \
), \
BOOST_VMD_IDENTITY(tuple), \
BOOST_VMD_DETAIL_EMPTY_RESULT \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY_D(d,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D \
( \
d, \
BOOST_PP_TUPLE_ELEM \
( \
0, \
tuple \
) \
), \
BOOST_VMD_IDENTITY(tuple), \
BOOST_VMD_DETAIL_EMPTY_RESULT \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_PROCESS(tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM \
( \
0, \
tuple \
) \
), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY \
) \
(tuple) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_PROCESS_D(d,tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM \
( \
0, \
tuple \
) \
), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY_D \
) \
(d,tuple) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_SPLIT(param) \
BOOST_VMD_DETAIL_ARRAY_PROCESS \
( \
BOOST_VMD_DETAIL_TUPLE(param,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_SPLIT_D(d,param) \
BOOST_VMD_DETAIL_ARRAY_PROCESS_D \
( \
d, \
BOOST_VMD_DETAIL_TUPLE_D(d,param,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY(tuple) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(tuple), \
tuple \
) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY_D(d,tuple) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,tuple), \
tuple \
) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE(tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(tuple), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY \
) \
(tuple) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE_D(d,tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(tuple), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY_D \
) \
(d,tuple) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_BEGIN(param) \
BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE \
( \
BOOST_VMD_DETAIL_TUPLE(param) \
) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_BEGIN_D(d,param) \
BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE_D \
( \
d, \
BOOST_VMD_DETAIL_TUPLE_D(d,param) \
) \
/**/
#define BOOST_VMD_DETAIL_ARRAY(...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_ARRAY_SPLIT, \
BOOST_VMD_DETAIL_ARRAY_BEGIN \
) \
(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_ARRAY_D(d,...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_ARRAY_SPLIT_D, \
BOOST_VMD_DETAIL_ARRAY_BEGIN_D \
) \
(d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#endif /* BOOST_VMD_DETAIL_ARRAY_HPP */

View File

@@ -0,0 +1,69 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_ASSERT_HPP)
#define BOOST_VMD_DETAIL_ASSERT_HPP
#include <boost/preprocessor/debug/assert.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#if BOOST_VMD_MSVC
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/if.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/vmd/empty.hpp>
#define BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_OUTPUT(errstr) \
BOOST_PP_ASSERT(0) \
typedef char errstr[-1]; \
/**/
#define BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_DEFAULT(...) \
BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_OUTPUT(BOOST_VMD_ASSERT_ERROR) \
/**/
#define BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_ERRSTR(...) \
BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_OUTPUT(BOOST_PP_VARIADIC_ELEM(1,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_ASSERT_TRUE(...) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL \
( \
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \
1 \
), \
BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_DEFAULT, \
BOOST_VMD_DETAIL_ASSERT_VC_GEN_ERROR_ERRSTR \
) \
(__VA_ARGS__) \
/**/
#define BOOST_VMD_DETAIL_ASSERT(...) \
BOOST_PP_IF \
( \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_ASSERT_TRUE \
) \
(__VA_ARGS__) \
/**/
#else
#define BOOST_VMD_DETAIL_ASSERT_DO(cond) \
BOOST_PP_ASSERT(cond) \
/**/
#define BOOST_VMD_DETAIL_ASSERT(...) \
BOOST_VMD_DETAIL_ASSERT_DO(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#endif /* BOOST_VMD_MSVC */
#endif /* BOOST_VMD_DETAIL_ASSERT_HPP */

View File

@@ -0,0 +1,202 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_1.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_2.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_3.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_4.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_5.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_6.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_7.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_8.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_9.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_10.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_11.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_12.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_13.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_14.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_15.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_16.hpp>
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_HPP */

View File

@@ -0,0 +1,409 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_COMMON_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_COMMON_HPP
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/array/elem.hpp>
#include <boost/preprocessor/array/size.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/list/at.hpp>
#include <boost/preprocessor/list/size.hpp>
#include <boost/preprocessor/logical/bitand.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/logical/compl.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/pop_front.hpp>
#include <boost/preprocessor/tuple/push_back.hpp>
#include <boost/preprocessor/tuple/replace.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/get_type.hpp>
#include <boost/vmd/detail/equal_type.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(vseq1,vseq2) \
BOOST_PP_BITAND \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq1), \
BOOST_PP_IS_BEGIN_PARENS(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_ARRAY(d,index,data) \
BOOST_PP_ARRAY_ELEM(index,data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_LIST(d,index,data) \
BOOST_PP_LIST_AT_D(d,data,index) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_SEQ(d,index,data) \
BOOST_PP_SEQ_ELEM(index,data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_TUPLE(d,index,data) \
BOOST_PP_TUPLE_ELEM(index,data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_ARRAY(data) \
BOOST_PP_ARRAY_SIZE(data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_LIST(data) \
BOOST_PP_LIST_SIZE(data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_SEQ(data) \
BOOST_PP_SEQ_SIZE(data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_TUPLE(data) \
BOOST_PP_TUPLE_SIZE(data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_ARRAY_D(d,data) \
BOOST_PP_ARRAY_SIZE(data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_LIST_D(d,data) \
BOOST_PP_LIST_SIZE_D(d,data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_SEQ_D(d,data) \
BOOST_PP_SEQ_SIZE(data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_TUPLE_D(d,data) \
BOOST_PP_TUPLE_SIZE(data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM(d,index,data,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_ARRAY, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_LIST, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_SEQ, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM_TUPLE \
) \
) \
) \
(d,index,data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(data,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_ARRAY, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_LIST, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_SEQ, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_TUPLE \
) \
) \
) \
(data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,data,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_ARRAY_D, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_LIST_D, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_SEQ_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_TUPLE_D \
) \
) \
) \
(d,data) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_RESULT(state) \
BOOST_PP_TUPLE_ELEM(0,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_FIRST(state) \
BOOST_PP_TUPLE_ELEM(1,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SECOND(state) \
BOOST_PP_TUPLE_ELEM(2,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SIZE(state) \
BOOST_PP_TUPLE_ELEM(3,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_TYPE(state) \
BOOST_PP_TUPLE_ELEM(4,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state) \
BOOST_PP_TUPLE_ELEM(5,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state) \
BOOST_PP_TUPLE_ELEM(6,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state) \
BOOST_PP_BITAND \
( \
BOOST_PP_EQUAL_D \
( \
d, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SIZE(state) \
), \
BOOST_PP_COMPL(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state)) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state) \
BOOST_VMD_IS_EMPTY(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state)) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_INDEX(state) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state), \
BOOST_VMD_EMPTY, \
BOOST_PP_TUPLE_ELEM \
) \
(0,BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state)) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP_NE_EMPTY(d,state) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
6, \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP_NE_REMOVE(d,state) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
6, \
BOOST_PP_TUPLE_POP_FRONT(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state)) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP(d,state) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state)),1), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP_NE_EMPTY, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP_NE_REMOVE \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH_CREATE(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
6, \
(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state)) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH_ADD(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
6, \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP(state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state) \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH(d,state) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH_CREATE, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH_ADD \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_INDEX(d,state) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_INDEX, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX \
) \
(state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM \
( \
d, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_INDEX(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_FIRST(state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_TYPE(state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_ELEM \
( \
d, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_INDEX(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SECOND(state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_TYPE(state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_PRED(d,state) \
BOOST_PP_BITAND \
( \
BOOST_PP_EQUAL_D \
( \
d, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_RESULT(state), \
1 \
), \
BOOST_PP_BITOR \
( \
BOOST_PP_NOT_EQUAL_D \
( \
d, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_SIZE(state) \
), \
BOOST_PP_COMPL \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_EMPTY(state) \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS_NCP(d,state) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
5, \
BOOST_PP_INC(BOOST_VMD_DETAIL_DATA_EQUAL_STATE_INDEX(state)) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS(d,state) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_POP, \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS_NCP \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_FAILURE(d,state) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
0, \
0 \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT(d,state,result) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,result,0), \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_FAILURE, \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,result,1), \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_SUCCESS, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PUSH \
) \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_TYPE(emf,ems,vtype) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_GET_TYPE(emf), \
vtype \
), \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_GET_TYPE(ems), \
vtype \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_TYPE_D(d,emf,ems,vtype) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_GET_TYPE(emf), \
vtype \
), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_GET_TYPE(ems), \
vtype \
) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_COMMON_HPP */

View File

@@ -0,0 +1,12 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EMPTY_RESULT_HPP)
#define BOOST_VMD_DETAIL_EMPTY_RESULT_HPP
#define BOOST_VMD_DETAIL_EMPTY_RESULT(...) (,)
#endif /* BOOST_VMD_DETAIL_EMPTY_RESULT_HPP */

View File

@@ -0,0 +1,583 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_HPP)
#define BOOST_VMD_DETAIL_EQUAL_HPP
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/detail/auto_rec.hpp>
#include <boost/preprocessor/facilities/empty.hpp>
#include <boost/preprocessor/facilities/overload.hpp>
#include <boost/preprocessor/logical/compl.hpp>
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#include <boost/vmd/is_identifier.hpp>
#include <boost/vmd/is_empty_list.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/recurse/equal/equal_1.hpp>
#include <boost/vmd/detail/recurse/equal/equal_2.hpp>
#include <boost/vmd/detail/recurse/equal/equal_3.hpp>
#include <boost/vmd/detail/recurse/equal/equal_4.hpp>
#include <boost/vmd/detail/recurse/equal/equal_5.hpp>
#include <boost/vmd/detail/recurse/equal/equal_6.hpp>
#include <boost/vmd/detail/recurse/equal/equal_7.hpp>
#include <boost/vmd/detail/recurse/equal/equal_8.hpp>
#include <boost/vmd/detail/recurse/equal/equal_9.hpp>
#include <boost/vmd/detail/recurse/equal/equal_10.hpp>
#include <boost/vmd/detail/recurse/equal/equal_11.hpp>
#include <boost/vmd/detail/recurse/equal/equal_12.hpp>
#include <boost/vmd/detail/recurse/equal/equal_13.hpp>
#include <boost/vmd/detail/recurse/equal/equal_14.hpp>
#include <boost/vmd/detail/recurse/equal/equal_15.hpp>
#include <boost/vmd/detail/recurse/equal/equal_16.hpp>
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_1(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_1_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_2(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_2_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_3(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_3_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_4(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_4_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_5(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_5_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_6(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_6_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_7(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_7_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_8(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_8_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_9(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_9_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_10(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_10_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_11(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_11_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_12(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_12_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_13(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_13_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_14(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_14_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_15(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_15_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_16(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_16_D(d,vseq1,vseq2)
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_AUTO_REC_D(n) \
BOOST_VMD_DETAIL_EQUAL_IS_1 \
( \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_ ## n(1,,) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_, \
BOOST_PP_AUTO_REC(BOOST_VMD_DETAIL_EQUAL_SIMPLE_AUTO_REC_D,16) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE(vseq1,vtype1,type) \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_TYPE_ARRAY, \
vtype1 \
), \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_TYPE_LIST, \
vtype1 \
), \
BOOST_PP_COMPL \
( \
BOOST_VMD_IS_EMPTY_LIST(vseq1) \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE_D(d,vseq1,vtype1,type) \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_TYPE_ARRAY, \
vtype1 \
), \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_TYPE_LIST, \
vtype1 \
), \
BOOST_PP_COMPL \
( \
BOOST_VMD_IS_EMPTY_LIST_D(d,vseq1) \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER(vseq1,vtype1,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_TYPE_IDENTIFIER, \
type \
), \
BOOST_VMD_IS_IDENTIFIER, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER_D(d,vseq1,vtype1,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_TYPE_IDENTIFIER, \
type \
), \
BOOST_VMD_IS_IDENTIFIER_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK(vseq1,vtype1,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_TYPE_TUPLE, \
type \
), \
BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE, \
BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER \
) \
(vseq1,vtype1,type) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_D(d,vseq1,vtype1,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_TYPE_TUPLE, \
type \
), \
BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE_D, \
BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER_D \
) \
(d,vseq1,vtype1,type) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE(vseq1,vtype1,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
type \
), \
BOOST_VMD_IDENTITY(1), \
BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK \
) \
(vseq1,vtype1,type) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_D(d,vseq1,vtype1,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
type \
), \
BOOST_VMD_IDENTITY(1), \
BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_D \
) \
(d,vseq1,vtype1,type) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_WT_CHECK(vseq1,vseq2,vtype1,vtype2,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(type), \
BOOST_VMD_DETAIL_EQUAL_TEST_TYPE, \
BOOST_VMD_IDENTITY(1) \
) \
(vseq1,vtype1,type) \
) \
), \
BOOST_VMD_DETAIL_EQUAL_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(type), \
BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_D, \
BOOST_VMD_IDENTITY(1) \
) \
(d,vseq1,vtype1,type) \
) \
), \
BOOST_VMD_DETAIL_EQUAL_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_WT_CONVERT(vseq1,vseq2,vtype1,vtype2,type) \
BOOST_VMD_DETAIL_EQUAL_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2), \
type \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2,type) \
BOOST_VMD_DETAIL_EQUAL_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2), \
type \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_WT(vseq1,vseq2,vtype1,vtype2,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2,type) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_WT_D(d,vseq1,vseq2,vtype1,vtype2,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2,type) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_GTYPE(vseq1,vseq2,type) \
BOOST_VMD_DETAIL_EQUAL_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE), \
type \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_GTYPE_D(d,vseq1,vseq2,type) \
BOOST_VMD_DETAIL_EQUAL_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE), \
type \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_EBP(vseq1,vseq2,be1,be2,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,type) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_EBP_D(d,vseq1,vseq2,be1,be2,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,type) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_EMPTY(vseq1,vseq2,be1,be2,type) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_EBP \
) \
(vseq1,vseq2,be1,be2,type) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_EMPTY_D(d,vseq1,vseq2,be1,be2,type) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_EBP_D \
) \
(d,vseq1,vseq2,be1,be2,type) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_OV0(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_EMPTY \
( \
vseq1, \
, \
BOOST_VMD_IS_EMPTY(vseq1), \
1, \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_OV1(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2), \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_OV2(vseq1,vseq2,type) \
BOOST_VMD_DETAIL_EQUAL_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2), \
type \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_D_OV0(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
( \
d, \
vseq1, \
, \
BOOST_VMD_IS_EMPTY(vseq1), \
1, \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_D_OV1(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2), \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_D_OV2(d,vseq1,vseq2,type) \
BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2), \
type \
) \
/**/
#if BOOST_VMD_MSVC
#define BOOST_VMD_DETAIL_EQUAL(vseq1,...) \
BOOST_PP_CAT(BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_OV,__VA_ARGS__)(vseq1,__VA_ARGS__),BOOST_PP_EMPTY()) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_D(d,vseq1,...) \
BOOST_PP_CAT(BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_D_OV,__VA_ARGS__)(d,vseq1,__VA_ARGS__),BOOST_PP_EMPTY()) \
/**/
#else
#define BOOST_VMD_DETAIL_EQUAL(vseq1,...) \
BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_OV,__VA_ARGS__)(vseq1,__VA_ARGS__) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_D(d,vseq1,...) \
BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_D_OV,__VA_ARGS__)(d,vseq1,__VA_ARGS__) \
/**/
#endif
#endif /* BOOST_VMD_DETAIL_EQUAL_HPP */

View File

@@ -0,0 +1,153 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_COMMON_HPP)
#define BOOST_VMD_DETAIL_EQUAL_COMMON_HPP
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/comparison/not_equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/logical/bitand.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/logical/bitxor.hpp>
#include <boost/preprocessor/logical/compl.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/vmd/get_type.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/match_single_identifier.hpp>
#include <boost/vmd/detail/equal_type.hpp>
#define BOOST_VMD_DETAIL_EQUAL_CONCAT_1 (1)
#define BOOST_VMD_DETAIL_EQUAL_IS_1(res) \
BOOST_PP_IS_BEGIN_PARENS \
( \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_EQUAL_CONCAT_, \
res \
) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_MATCH_SINGLE_IDENTIFIER(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(vseq1,vseq2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_CNI_SMP(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_NUMBER), \
BOOST_PP_EQUAL, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TYPE), \
BOOST_VMD_DETAIL_EQUAL_TYPE, \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER \
) \
) \
(vseq1,vseq2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_NUMBER), \
BOOST_PP_EQUAL_D, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TYPE), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D, \
BOOST_VMD_DETAIL_EQUAL_MATCH_SINGLE_IDENTIFIER \
) \
) \
(d,vseq1,vseq2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_SIZE(vseq1,vseq2) \
BOOST_PP_NOT_EQUAL \
( \
BOOST_PP_TUPLE_SIZE(vseq1), \
BOOST_PP_TUPLE_SIZE(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_SIZE_D(d,vseq1,vseq2) \
BOOST_PP_NOT_EQUAL_D \
( \
d, \
BOOST_PP_TUPLE_SIZE(vseq1), \
BOOST_PP_TUPLE_SIZE(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype1,BOOST_VMD_TYPE_TUPLE), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype2,BOOST_VMD_TYPE_TUPLE) \
), \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_SIZE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype1,BOOST_VMD_TYPE_TUPLE), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype2,BOOST_VMD_TYPE_TUPLE) \
), \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_SIZE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY(...) 1
#define BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(bp1,bp2) \
BOOST_PP_COMPL \
( \
BOOST_PP_BITXOR \
( \
bp1, \
bp2 \
) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq1), \
BOOST_PP_IS_BEGIN_PARENS(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_CHK_EMPTY_MATCH(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH \
( \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_COMMON_HPP */

View File

@@ -0,0 +1,21 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_TYPE_HPP)
#define BOOST_VMD_DETAIL_EQUAL_TYPE_HPP
#include <boost/vmd/detail/match_single_identifier.hpp>
#include <boost/vmd/detail/type_registration.hpp>
#define BOOST_VMD_DETAIL_EQUAL_TYPE(type1,type2) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(type1,type2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,type1,type2) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(type1,type2) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_TYPE_HPP */

View File

@@ -0,0 +1,429 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IDENTIFIER_HPP)
#define BOOST_VMD_DETAIL_IDENTIFIER_HPP
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/logical/bitand.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/identifier_concat.hpp>
#include <boost/vmd/detail/is_entire.hpp>
#include <boost/vmd/detail/match_identifier.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/parens.hpp>
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_SUCCESS(id,rest,keymatch,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_SUCCESS_MODS(id,rest,BOOST_PP_DEC(keymatch),mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_FAILURE(id,rest,keymatch,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_RESULT(id,rest,keymatch,mods) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(keymatch,0), \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_FAILURE, \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_SUCCESS \
) \
(id,rest,keymatch,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_RESULT_D(d,id,rest,keymatch,mods) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,keymatch,0), \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_FAILURE, \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_SUCCESS \
) \
(id,rest,keymatch,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE(id,rest,keytuple,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_RESULT \
( \
id, \
rest, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER(id,keytuple), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_D(d,id,rest,keytuple,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_RESULT_D \
( \
d, \
id, \
rest, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D(d,id,keytuple), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_MAKE_SPLIT(tuple) \
( \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_TUPLE_ELEM(0,tuple) \
), \
BOOST_PP_TUPLE_ELEM(1,tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE_CONCAT_DATA(tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(0,tuple) \
), \
BOOST_VMD_IDENTITY(tuple), \
BOOST_VMD_DETAIL_IDENTIFIER_MAKE_SPLIT \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE_CONCAT(vcseq) \
BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE_CONCAT_DATA \
( \
BOOST_VMD_DETAIL_PARENS(vcseq,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_GETID_TID(tid) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(tid), \
BOOST_VMD_IDENTITY(tid), \
BOOST_PP_TUPLE_ELEM \
) \
(0,tid) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_GETID_SEQUENCE(vseq) \
BOOST_VMD_DETAIL_IDENTIFIER_GETID_TID \
( \
BOOST_VMD_DETAIL_PARENS(BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq)) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE(vseq) \
BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE_CONCAT \
( \
BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS(id,rest,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE \
( \
id, \
rest, \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_D(d,id,rest,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_TUPLE_D \
( \
d, \
id, \
rest, \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_JUST(id,rest,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_SUCCESS_MODS(id,rest,0,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_JUST_D(d,id,rest,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_SUCCESS_MODS(id,rest,0,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS(id,rest,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods) \
), \
BOOST_VMD_DETAIL_IDENTIFIER_JUST, \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS \
) \
(id,rest,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS_D(d,id,rest,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods) \
), \
BOOST_VMD_DETAIL_IDENTIFIER_JUST_D, \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_KEYS_D \
) \
(d,id,rest,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_MKEYS(mods) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(mods), \
BOOST_VMD_DETAIL_NOT_EMPTY \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(mods) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SUCCESS_MODS(id,rest,keymatch,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IDENTIFIER_MKEYS(mods), \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
(id,rest,keymatch), \
(id,keymatch) \
), \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
(id,rest), \
id \
) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IDENTIFIER_MKEYS(mods), \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
(,,), \
(,) \
), \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
(,) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST(id,rest,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST_D(d,id,rest,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_ID_REST(id,rest,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(id), \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST, \
BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS \
) \
(id,rest,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_ID_REST_D(d,id,rest,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(id), \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST_D, \
BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS_D \
) \
(d,id,rest,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_DATA(tuple,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_ID_REST \
( \
BOOST_PP_TUPLE_ELEM(0,tuple), \
BOOST_PP_TUPLE_ELEM(1,tuple), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_ID(id,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(id), \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST, \
BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS \
) \
(id,,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_ID_D(d,id,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(id), \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_REST_D, \
BOOST_VMD_DETAIL_IDENTIFIER_CHECK_KEYS_D \
) \
(d,id,,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_DATA_D(d,tuple,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_ID_REST_D \
( \
d, \
BOOST_PP_TUPLE_ELEM(0,tuple), \
BOOST_PP_TUPLE_ELEM(1,tuple), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_AFTER(vseq,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_DATA \
( \
BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE(vseq), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_AFTER_D(d,vseq,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_DATA_D \
( \
d, \
BOOST_VMD_DETAIL_IDENTIFIER_SPLIT_SEQUENCE(vseq), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_ID(vseq,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_ID \
( \
BOOST_VMD_DETAIL_IDENTIFIER_GETID_SEQUENCE(vseq), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_ID_D(d,vseq,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_PROCESS_ID_D \
( \
d, \
BOOST_VMD_DETAIL_IDENTIFIER_GETID_SEQUENCE(vseq), \
mods \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE(vseq,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_AFTER, \
BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_ID \
) \
(vseq,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_D(d,vseq,mods) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(mods), \
BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_AFTER_D, \
BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_ID_D \
) \
(d,vseq,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_EX_FAILURE(vseq,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_EX_FAILURE_D(d,vseq,mods) \
BOOST_VMD_DETAIL_IDENTIFIER_FAILURE_MODS(mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_EX(vseq,mods) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_IS_EMPTY(vseq), \
BOOST_PP_IS_BEGIN_PARENS(vseq) \
), \
BOOST_VMD_DETAIL_IDENTIFIER_EX_FAILURE, \
BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE \
) \
(vseq,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_EX_D(d,vseq,mods) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_IS_EMPTY(vseq), \
BOOST_PP_IS_BEGIN_PARENS(vseq) \
), \
BOOST_VMD_DETAIL_IDENTIFIER_EX_FAILURE_D, \
BOOST_VMD_DETAIL_IDENTIFIER_SEQUENCE_D \
) \
(d,vseq,mods) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER(...) \
BOOST_VMD_DETAIL_IDENTIFIER_EX \
( \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_INDEX,__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_D(d,...) \
BOOST_VMD_DETAIL_IDENTIFIER_EX_D \
( \
d, \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_INDEX,__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE(...) \
BOOST_VMD_DETAIL_IS_ENTIRE \
( \
BOOST_VMD_DETAIL_IDENTIFIER(__VA_ARGS__,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE_D(d,...) \
BOOST_VMD_DETAIL_IS_ENTIRE \
( \
BOOST_VMD_DETAIL_IDENTIFIER_D(d,__VA_ARGS__,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IDENTIFIER_HPP */

View File

@@ -0,0 +1,21 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IDENTIFIER_CONCAT_HPP)
#define BOOST_VMD_DETAIL_IDENTIFIER_CONCAT_HPP
#include <boost/preprocessor/cat.hpp>
#include <boost/vmd/detail/idprefix.hpp>
#define BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq) \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_IDENTIFIER_REGISTRATION_PREFIX, \
vseq \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IDENTIFIER_CONCAT_HPP */

View File

@@ -0,0 +1,118 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP)
#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_tuple.hpp>
#include <boost/vmd/detail/idprefix.hpp>
#include <boost/vmd/detail/number_registration.hpp>
#include <boost/vmd/detail/type_registration.hpp>
#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_IDENTIFIER_SUBTYPE_REGISTRATION_PREFIX, \
id \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE(cres) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL \
( \
BOOST_PP_TUPLE_SIZE(cres), \
2 \
), \
BOOST_PP_TUPLE_ELEM, \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
) \
(0,cres) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE_D(d,cres) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D \
( \
d, \
BOOST_PP_TUPLE_SIZE(cres), \
2 \
), \
BOOST_PP_TUPLE_ELEM, \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
) \
(0,cres) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT(cres) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(cres), \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE, \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
) \
(cres) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT_D(d,cres) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(cres), \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE_SIZE_D, \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_IDENTIFIER) \
) \
(d,cres) \
) \
/**/
/*
Determines the type of an identifier.
The type may be that of an identifier or else
it may be a subtype.
Assumes the 'id' is a valid identifier id
Expands to the appropriate type
*/
#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE(id) \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT \
( \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
) \
/**/
#define BOOST_VMD_DETAIL_IDENTIFIER_TYPE_D(d,id) \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCAT_D \
( \
d, \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE_CONCATENATE(id) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IDENTIFIER_TYPE_HPP */

View File

@@ -0,0 +1,14 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IDPREFIX_HPP)
#define BOOST_VMD_DETAIL_IDPREFIX_HPP
#define BOOST_VMD_DETAIL_IDENTIFIER_DETECTION_PREFIX BOOST_VMD_DETECT_
#define BOOST_VMD_DETAIL_IDENTIFIER_REGISTRATION_PREFIX BOOST_VMD_REGISTER_
#define BOOST_VMD_DETAIL_IDENTIFIER_SUBTYPE_REGISTRATION_PREFIX BOOST_VMD_SUBTYPE_REGISTER_
#endif /* BOOST_VMD_DETAIL_IDPREFIX_HPP */

View File

@@ -0,0 +1,41 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_ARRAY_HPP)
#define BOOST_VMD_DETAIL_IS_ARRAY_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_tuple.hpp>
#include <boost/vmd/detail/is_array_common.hpp>
#define BOOST_VMD_DETAIL_IS_ARRAY(vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(vseq), \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_D(d,vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(vseq), \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_ARRAY_HPP */

View File

@@ -0,0 +1,248 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP)
#define BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/if.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/facilities/empty.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/is_number.hpp>
#include <boost/vmd/is_tuple.hpp>
#include <boost/vmd/detail/is_empty_tuple.hpp>
#define BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(2,BOOST_PP_TUPLE_SIZE(tuple)), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM, \
BOOST_VMD_IDENTITY(0) \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,2,BOOST_PP_TUPLE_SIZE(tuple)), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,tuple) \
) \
/**/
/*
Check if the first element of the tuple is equal to the number of tuple elements of the second element
*/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE(x) \
BOOST_PP_EQUAL(BOOST_PP_TUPLE_ELEM(0,x),BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,x))) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE_D(d,x) \
BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_ELEM(0,x),BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,x))) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY(tuple) \
BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,tuple)) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY_D(d,tuple) \
BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,tuple)) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH(tuple) \
BOOST_PP_IF \
( \
BOOST_PP_TUPLE_ELEM(0,tuple), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE, \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY \
) \
(tuple) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_D(d,tuple) \
BOOST_PP_IF \
( \
BOOST_PP_TUPLE_ELEM(0,tuple), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE_D, \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY_D \
) \
(d,tuple) \
/**/
/*
Check if the first element is numeric
*/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC(tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_NUM(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH, \
BOOST_VMD_IDENTITY(0) \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_D(d,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_NUM(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER(tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_NUMBER(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC, \
BOOST_VMD_IDENTITY(0) \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER_D(d,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_NUMBER(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,tuple) \
) \
/**/
/*
Check if the second element is a tuple
*/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM(tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(BOOST_PP_TUPLE_ELEM(1,tuple)), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER, \
BOOST_VMD_IDENTITY(0) \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM_D(d,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(BOOST_PP_TUPLE_ELEM(1,tuple)), \
BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM(x) BOOST_VMD_IS_EMPTY(BOOST_PP_CAT(BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_, x) BOOST_PP_EMPTY())
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_0
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_1
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_2
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_3
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_4
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_5
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_6
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_7
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_8
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_9
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_10
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_11
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_12
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_13
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_14
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_15
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_16
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_17
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_18
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_19
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_20
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_21
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_22
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_23
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_24
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_25
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_26
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_27
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_28
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_29
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_30
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_31
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_32
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_33
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_34
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_35
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_36
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_37
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_38
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_39
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_40
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_41
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_42
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_43
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_44
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_45
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_46
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_47
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_48
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_49
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_50
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_51
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_52
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_53
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_54
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_55
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_56
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_57
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_58
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_59
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_60
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_61
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_62
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_63
#define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_64
#endif /* BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP */

View File

@@ -0,0 +1,61 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_EMPTY_HPP)
#define BOOST_VMD_DETAIL_IS_EMPTY_HPP
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#if BOOST_VMD_MSVC
# pragma warning(once:4002)
#define BOOST_VMD_DETAIL_IS_EMPTY_IIF_0(t, b) b
#define BOOST_VMD_DETAIL_IS_EMPTY_IIF_1(t, b) t
#if BOOST_VMD_MSVC_V8
#define BOOST_VMD_DETAIL_IS_EMPTY_PROCESS(param) \
BOOST_PP_IS_BEGIN_PARENS \
( \
BOOST_VMD_DETAIL_IS_EMPTY_NON_FUNCTION_C param () \
) \
/**/
#else
#define BOOST_VMD_DETAIL_IS_EMPTY_PROCESS(...) \
BOOST_PP_IS_BEGIN_PARENS \
( \
BOOST_VMD_DETAIL_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () \
) \
/**/
#endif
#else
#define BOOST_VMD_DETAIL_IS_EMPTY_IIF_0(t, ...) __VA_ARGS__
#define BOOST_VMD_DETAIL_IS_EMPTY_IIF_1(t, ...) t
#define BOOST_VMD_DETAIL_IS_EMPTY_PROCESS(...) \
BOOST_PP_IS_BEGIN_PARENS \
( \
BOOST_VMD_DETAIL_IS_EMPTY_NON_FUNCTION_C __VA_ARGS__ () \
) \
/**/
#endif /* BOOST_VMD_MSVC */
#define BOOST_VMD_DETAIL_IS_EMPTY_PRIMITIVE_CAT(a, b) a ## b
#define BOOST_VMD_DETAIL_IS_EMPTY_IIF(bit) \
BOOST_VMD_DETAIL_IS_EMPTY_PRIMITIVE_CAT(BOOST_VMD_DETAIL_IS_EMPTY_IIF_,bit) \
/**/
#define BOOST_VMD_DETAIL_IS_EMPTY_NON_FUNCTION_C(...) ()
#define BOOST_VMD_DETAIL_IS_EMPTY_GEN_ZERO(...) 0
#endif /* BOOST_VMD_DETAIL_IS_EMPTY_HPP */

View File

@@ -0,0 +1,20 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_HPP)
#define BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_HPP
#include <boost/preprocessor/array/size.hpp>
#include <boost/preprocessor/logical/not.hpp>
#define BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_SIZE(array) \
BOOST_PP_NOT \
( \
BOOST_PP_ARRAY_SIZE(array) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_EMPTY_ARRAY_HPP */

View File

@@ -0,0 +1,74 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_HPP)
#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_HPP
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/is_tuple.hpp>
#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_CEM(tuple) \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)) \
/**/
#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_CEM, \
BOOST_VMD_IDENTITY(0) \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE_D(d,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(tuple),1), \
BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_CEM, \
BOOST_VMD_IDENTITY(0) \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE(tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(tuple), \
BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE, \
BOOST_VMD_IDENTITY(0) \
) \
(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_D(d,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(tuple), \
BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,tuple) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_HPP */

View File

@@ -0,0 +1,23 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_ENTIRE_HPP)
#define BOOST_VMD_DETAIL_IS_ENTIRE_HPP
#include <boost/preprocessor/logical/bitand.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#define BOOST_VMD_DETAIL_IS_ENTIRE(tuple) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_ENTIRE_HPP */

View File

@@ -0,0 +1,65 @@
// (C) Copyright Edward Diener 2020
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_HPP)
#define BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_HPP
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/identifier_concat.hpp>
#define BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_VSEQ_RESULT(ignored) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_VMD_IDENTITY(1)(ignored) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_VSEQ_ID(vseq) \
BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_VSEQ_RESULT(BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq)) \
/**/
#define BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_VSEQ(vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_IS_EMPTY(vseq), \
BOOST_PP_IS_BEGIN_PARENS(vseq) \
), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_VSEQ_ID \
) \
(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_SINGLE(...) \
BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_VSEQ(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER(...) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),1), \
BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_SINGLE, \
BOOST_VMD_IDENTITY(0) \
) \
(__VA_ARGS__) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_GENERAL_IDENTIFIER_HPP */

View File

@@ -0,0 +1,96 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP)
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/is_tuple.hpp>
#include <boost/vmd/detail/identifier.hpp>
#include <boost/vmd/detail/identifier_concat.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_MATCH(tup) \
BOOST_VMD_DETAIL_NOT_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(0,tup) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_TUPLE(ptup) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(ptup), \
BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_MATCH, \
BOOST_VMD_IDENTITY(0) \
) \
(ptup) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_ID(vseq) \
BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_TUPLE \
( \
BOOST_VMD_DETAIL_IDENTIFIER_CONCATENATE(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_IS_EMPTY(vseq), \
BOOST_PP_IS_BEGIN_PARENS(vseq) \
), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ_ID \
) \
(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE(...) \
BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE_D(d,...) \
BOOST_VMD_DETAIL_IS_IDENTIFIER_VSEQ(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER(...) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),1), \
BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE, \
BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE \
) \
(__VA_ARGS__) \
/**/
#define BOOST_VMD_DETAIL_IS_IDENTIFIER_D(d,...) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),1), \
BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE_D, \
BOOST_VMD_DETAIL_IS_IDENTIFIER_MULTIPLE_D \
) \
(d,__VA_ARGS__) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_IDENTIFIER_HPP */

View File

@@ -0,0 +1,207 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_LIST_HPP)
#define BOOST_VMD_DETAIL_IS_LIST_HPP
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/debug/assert.hpp>
#include <boost/preprocessor/facilities/empty.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/logical/compl.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/is_identifier.hpp>
#include <boost/vmd/is_tuple.hpp>
#include <boost/vmd/detail/nil_registration.hpp>
#define BOOST_VMD_DETAIL_IS_LIST_PROCESS_TUPLE(d,x) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_TUPLE(x), \
BOOST_VMD_DETAIL_IS_LIST_PROCESS_TUPLE_SIZE, \
BOOST_VMD_DETAIL_IS_LIST_ASSERT \
) \
(d,x) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_PROCESS_TUPLE_SIZE(d,x) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,2,BOOST_PP_TUPLE_SIZE(x)), \
BOOST_VMD_DETAIL_IS_LIST_RETURN_SECOND, \
BOOST_VMD_DETAIL_IS_LIST_ASSERT \
) \
(x) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_PRED(d,state) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(state), \
BOOST_VMD_IDENTITY(1), \
BOOST_VMD_DETAIL_IS_LIST_NOT_BOOST_PP_NIL \
) \
(state) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_OP(d,state) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(state), \
BOOST_VMD_DETAIL_IS_LIST_PROCESS_TUPLE, \
BOOST_VMD_DETAIL_IS_LIST_PROCESS_IF_BOOST_PP_NIL \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_PROCESS_IF_BOOST_PP_NIL(d,x) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_LIST_BOOST_PP_NIL(x), \
BOOST_PP_NIL, \
BOOST_VMD_IS_LIST_FAILURE \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_ASSERT(...) \
BOOST_VMD_IS_LIST_FAILURE \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_NOT_BOOST_PP_NIL(x) \
BOOST_PP_COMPL \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_IS_LIST_BOOST_PP_NIL(x), \
BOOST_VMD_DETAIL_IS_LIST_IS_FAILURE(x) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_BOOST_PP_NIL(x) \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_IS_LIST_NIL_HELPER_, \
x \
) BOOST_PP_EMPTY() \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_NIL_HELPER_BOOST_PP_NIL
#define BOOST_VMD_DETAIL_IS_LIST_IS_FAILURE(x) \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_CAT(BOOST_VMD_DETAIL_IS_LIST_FHELPER_,x) BOOST_PP_EMPTY() \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_FHELPER_BOOST_VMD_IS_LIST_FAILURE
#define BOOST_VMD_DETAIL_IS_LIST_RETURN_SECOND(x) \
BOOST_PP_TUPLE_ELEM(1,x) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_RESULT(x) \
BOOST_PP_COMPL \
( \
BOOST_VMD_DETAIL_IS_LIST_IS_FAILURE(x) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_WLOOP(list) \
BOOST_VMD_DETAIL_IS_LIST_RESULT \
( \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_IS_LIST_PRED, \
BOOST_VMD_DETAIL_IS_LIST_OP, \
list \
) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_WLOOP_D(d,list) \
BOOST_VMD_DETAIL_IS_LIST_RESULT \
( \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_IS_LIST_PRED, \
BOOST_VMD_DETAIL_IS_LIST_OP, \
list \
) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS(list) \
BOOST_VMD_IS_IDENTIFIER(list,BOOST_PP_NIL) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS_D(d,list) \
BOOST_VMD_IS_IDENTIFIER_D(d,list,BOOST_PP_NIL) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_PROCESS(param) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(param), \
BOOST_VMD_DETAIL_IS_LIST_WLOOP, \
BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS \
) \
(param) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST(param) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(param), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_IS_LIST_PROCESS \
) \
(param) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_PROCESS_D(d,param) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(param), \
BOOST_VMD_DETAIL_IS_LIST_WLOOP_D, \
BOOST_VMD_DETAIL_IS_LIST_IS_EMPTY_LIST_PROCESS_D \
) \
(d,param) \
/**/
#define BOOST_VMD_DETAIL_IS_LIST_D(d,param) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(param), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_IS_LIST_PROCESS_D \
) \
(d,param) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_LIST_HPP */

View File

@@ -0,0 +1,38 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_NUMBER_HPP)
#define BOOST_VMD_DETAIL_IS_NUMBER_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/detail/equal_type.hpp>
#include <boost/vmd/detail/identifier_type.hpp>
#include <boost/vmd/detail/is_identifier.hpp>
#include <boost/vmd/detail/number_registration.hpp>
#define BOOST_VMD_DETAIL_IS_NUMBER_TYPE(vseq) \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_TYPE_NUMBER, \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_NUMBER(vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE(vseq), \
BOOST_VMD_DETAIL_IS_NUMBER_TYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_NUMBER_HPP */

View File

@@ -0,0 +1,27 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_SEQ_HPP)
#define BOOST_VMD_DETAIL_IS_SEQ_HPP
#include <boost/vmd/detail/is_entire.hpp>
#include <boost/vmd/detail/seq.hpp>
#define BOOST_VMD_DETAIL_IS_SEQ(seq) \
BOOST_VMD_DETAIL_IS_ENTIRE \
( \
BOOST_VMD_DETAIL_SEQ_SPLIT(seq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_SEQ_D(d,seq) \
BOOST_VMD_DETAIL_IS_ENTIRE \
( \
BOOST_VMD_DETAIL_SEQ_SPLIT_D(d,seq) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_SEQ_HPP */

View File

@@ -0,0 +1,20 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_TUPLE_HPP)
#define BOOST_VMD_DETAIL_IS_TUPLE_HPP
#include <boost/vmd/detail/is_entire.hpp>
#include <boost/vmd/detail/parens_split.hpp>
#define BOOST_VMD_DETAIL_IS_TUPLE(vseq) \
BOOST_VMD_DETAIL_IS_ENTIRE \
( \
BOOST_VMD_DETAIL_PARENS_SPLIT(vseq) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_TUPLE_HPP */

View File

@@ -0,0 +1,57 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_TYPE_HPP)
#define BOOST_VMD_DETAIL_IS_TYPE_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/detail/identifier_type.hpp>
#include <boost/vmd/detail/is_type_type.hpp>
#include <boost/vmd/detail/is_identifier.hpp>
#include <boost/vmd/detail/type_registration.hpp>
#define BOOST_VMD_DETAIL_IS_TYPE_IMP_TYPE(vseq) \
BOOST_VMD_DETAIL_IS_TYPE_TYPE \
( \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_TYPE_IMP_TYPE_D(d,vseq) \
BOOST_VMD_DETAIL_IS_TYPE_TYPE \
( \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE_D(d,vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_TYPE(vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE(vseq), \
BOOST_VMD_DETAIL_IS_TYPE_IMP_TYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_TYPE_D(d,vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_IDENTIFIER_SINGLE_D(d,vseq), \
BOOST_VMD_DETAIL_IS_TYPE_IMP_TYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_TYPE_HPP */

View File

@@ -0,0 +1,25 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_IS_TYPE_TYPE_HPP)
#define BOOST_VMD_DETAIL_IS_TYPE_TYPE_HPP
#include <boost/vmd/detail/type_registration.hpp>
#include <boost/vmd/detail/match_single_identifier.hpp>
/*
Check to see if the 'id' is BOOST_VMD_TYPE_TYPE
Returns 1 if it is, else 0
*/
#define BOOST_VMD_DETAIL_IS_TYPE_TYPE(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_TYPE_TYPE) \
/**/
#endif /* BOOST_VMD_DETAIL_IS_TYPE_TYPE_HPP */

View File

@@ -0,0 +1,212 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_LIST_HPP)
#define BOOST_VMD_DETAIL_LIST_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/pop_back.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/empty_result.hpp>
#include <boost/vmd/detail/identifier.hpp>
#include <boost/vmd/detail/is_list.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/parens.hpp>
#define BOOST_VMD_DETAIL_LIST_CHECK_FOR_LIST(tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_LIST \
( \
BOOST_PP_TUPLE_ELEM \
( \
0, \
tuple \
) \
), \
tuple, \
(,) \
) \
/**/
#define BOOST_VMD_DETAIL_LIST_CHECK_FOR_LIST_D(d,tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_LIST_D \
( \
d, \
BOOST_PP_TUPLE_ELEM \
( \
0, \
tuple \
) \
), \
tuple, \
(,) \
) \
/**/
#define BOOST_VMD_DETAIL_LIST_CHECK_RETURN(tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM \
( \
0, \
tuple \
) \
), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_LIST_CHECK_FOR_LIST \
) \
(tuple) \
/**/
#define BOOST_VMD_DETAIL_LIST_CHECK_RETURN_D(d,tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM \
( \
0, \
tuple \
) \
), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_LIST_CHECK_FOR_LIST_D \
) \
(d,tuple) \
/**/
#define BOOST_VMD_DETAIL_LIST_EMPTY_LIST(list) \
BOOST_VMD_DETAIL_IDENTIFIER(list,BOOST_PP_NIL,BOOST_VMD_RETURN_AFTER,BOOST_VMD_RETURN_INDEX) \
/**/
#define BOOST_VMD_DETAIL_LIST_EMPTY_LIST_D(d,list) \
BOOST_VMD_DETAIL_IDENTIFIER_D(d,list,BOOST_PP_NIL,BOOST_VMD_RETURN_AFTER,BOOST_VMD_RETURN_INDEX) \
/**/
#define BOOST_VMD_DETAIL_LIST_TUPLE(param) \
BOOST_VMD_DETAIL_LIST_CHECK_RETURN \
( \
BOOST_VMD_DETAIL_PARENS(param,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_LIST_TUPLE_D(d,param) \
BOOST_VMD_DETAIL_LIST_CHECK_RETURN_D \
( \
d, \
BOOST_VMD_DETAIL_PARENS_D(d,param,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_LIST_EMPTY_PROCESS(tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(0,tuple) \
), \
(,), \
tuple \
) \
/**/
#define BOOST_VMD_DETAIL_LIST_EMPTY(list) \
BOOST_VMD_DETAIL_LIST_EMPTY_PROCESS \
( \
BOOST_VMD_DETAIL_LIST_EMPTY_LIST(list) \
) \
/**/
#define BOOST_VMD_DETAIL_LIST_EMPTY_D(d,list) \
BOOST_VMD_DETAIL_LIST_EMPTY_PROCESS \
( \
BOOST_VMD_DETAIL_LIST_EMPTY_LIST_D(d,list) \
) \
/**/
#define BOOST_VMD_DETAIL_LIST_PROCESS(list) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(list), \
BOOST_VMD_DETAIL_LIST_TUPLE, \
BOOST_VMD_DETAIL_LIST_EMPTY \
) \
(list) \
/**/
#define BOOST_VMD_DETAIL_LIST_SPLIT(list) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(list), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_LIST_PROCESS \
) \
(list) \
/**/
#define BOOST_VMD_DETAIL_LIST_BEGIN(list) \
BOOST_PP_TUPLE_ELEM(0,BOOST_VMD_DETAIL_LIST_SPLIT(list)) \
/**/
#define BOOST_VMD_DETAIL_LIST_PROCESS_D(d,list) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(list), \
BOOST_VMD_DETAIL_LIST_TUPLE_D, \
BOOST_VMD_DETAIL_LIST_EMPTY_D \
) \
(d,list) \
/**/
#define BOOST_VMD_DETAIL_LIST_SPLIT_D(d,list) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(list), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_LIST_PROCESS_D \
) \
(d,list) \
/**/
#define BOOST_VMD_DETAIL_LIST_BEGIN_D(d,list) \
BOOST_PP_TUPLE_ELEM(0,BOOST_VMD_DETAIL_LIST_SPLIT_D(d,list)) \
/**/
#define BOOST_VMD_DETAIL_LIST_D(d,...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_LIST_SPLIT_D, \
BOOST_VMD_DETAIL_LIST_BEGIN_D \
) \
(d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_LIST(...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_LIST_SPLIT, \
BOOST_VMD_DETAIL_LIST_BEGIN \
) \
(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#endif /* BOOST_VMD_DETAIL_LIST_HPP */

View File

@@ -0,0 +1,160 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_MATCH_IDENTIFIER_HPP)
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_HPP
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/comparison/not_equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/logical/bitand.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/replace.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/idprefix.hpp>
#include <boost/vmd/detail/match_identifier_common.hpp>
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_ID(state) \
BOOST_PP_TUPLE_ELEM(0,state) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_TUPLE(state) \
BOOST_PP_TUPLE_ELEM(1,state) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_TUPLE_SIZE(state) \
BOOST_PP_TUPLE_ELEM(2,state) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_CURRENT(state) \
BOOST_PP_TUPLE_ELEM \
( \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state), \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_TUPLE(state) \
) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state) \
BOOST_PP_TUPLE_ELEM(3,state) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_RESULT(state) \
BOOST_PP_TUPLE_ELEM(4,state) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_PRED(d,state) \
BOOST_PP_BITAND \
( \
BOOST_PP_EQUAL_D \
( \
d, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_RESULT(state), \
0 \
), \
BOOST_PP_NOT_EQUAL_D \
( \
d, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state), \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_TUPLE_SIZE(state) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_FOUND(d,state) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
4, \
BOOST_PP_INC \
( \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CONTINUE(d,state) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
3, \
BOOST_PP_INC \
( \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_INDEX(state) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP(d,state) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CMP_IDS \
( \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_ID(state), \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_STATE_KEY_CURRENT(state) \
), \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_FOUND, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CONTINUE \
) \
(d,state) \
/**/
/*
Return index starting with 1 of the tuple id the identifier matches, or 0 if there are no matches.
*/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER(id,keytuple) \
BOOST_PP_TUPLE_ELEM \
( \
4, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_PRED, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP, \
( \
id, \
keytuple, \
BOOST_PP_TUPLE_SIZE(keytuple), \
0, \
0 \
) \
) \
) \
/**/
/*
Return index starting with 1 of the tuple id the identifier matches, or 0 if there are no matches.
*/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D(d,id,keytuple) \
BOOST_PP_TUPLE_ELEM \
( \
4, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_PRED, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP, \
( \
id, \
keytuple, \
BOOST_PP_TUPLE_SIZE(keytuple), \
0, \
0 \
) \
) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_MATCH_IDENTIFIER_HPP */

View File

@@ -0,0 +1,37 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_MATCH_IDENTIFIER_COMMON_HPP)
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_COMMON_HPP
#include <boost/preprocessor/cat.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/idprefix.hpp>
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CREATE_ID_RESULT(id,keyid) \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_IDENTIFIER_DETECTION_PREFIX, \
BOOST_PP_CAT \
( \
keyid, \
BOOST_PP_CAT \
( \
_, \
id \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CMP_IDS(id,keyid) \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CREATE_ID_RESULT(id,keyid) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_MATCH_IDENTIFIER_COMMON_HPP */

View File

@@ -0,0 +1,16 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER_HPP)
#define BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER_HPP
#include <boost/vmd/detail/match_identifier_common.hpp>
#define BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,key) \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_OP_CMP_IDS(id,key) \
/**/
#endif /* BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER_HPP */

View File

@@ -0,0 +1,104 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_MODIFIERS_HPP)
#define BOOST_VMD_DETAIL_MODIFIERS_HPP
#include <boost/vmd/detail/match_single_identifier.hpp>
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_NO_TYPE (BOOST_VMD_RETURN_NO_TYPE)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_TYPE (BOOST_VMD_RETURN_TYPE)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_TYPE_TUPLE (BOOST_VMD_RETURN_TYPE_TUPLE)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_TYPE_ARRAY (BOOST_VMD_RETURN_TYPE_ARRAY)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_TYPE_LIST (BOOST_VMD_RETURN_TYPE_LIST)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_AFTER (BOOST_VMD_RETURN_AFTER)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_NO_AFTER (BOOST_VMD_RETURN_NO_AFTER)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_ONLY_AFTER (BOOST_VMD_RETURN_ONLY_AFTER)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_INDEX (BOOST_VMD_RETURN_INDEX)
#define BOOST_VMD_REGISTER_BOOST_VMD_RETURN_NO_INDEX (BOOST_VMD_RETURN_NO_INDEX)
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_NO_TYPE_BOOST_VMD_RETURN_NO_TYPE
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_TYPE_BOOST_VMD_RETURN_TYPE
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_TYPE_TUPLE_BOOST_VMD_RETURN_TYPE_TUPLE
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_TYPE_ARRAY_BOOST_VMD_RETURN_TYPE_ARRAY
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_TYPE_LIST_BOOST_VMD_RETURN_TYPE_LIST
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_AFTER_BOOST_VMD_RETURN_AFTER
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_NO_AFTER_BOOST_VMD_RETURN_NO_AFTER
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_ONLY_AFTER_BOOST_VMD_RETURN_ONLY_AFTER
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_INDEX_BOOST_VMD_RETURN_INDEX
#define BOOST_VMD_DETECT_BOOST_VMD_RETURN_NO_INDEX_BOOST_VMD_RETURN_NO_INDEX
#define BOOST_VMD_REGISTER_BOOST_VMD_ALLOW_ALL (BOOST_VMD_ALLOW_ALL)
#define BOOST_VMD_REGISTER_BOOST_VMD_ALLOW_RETURN (BOOST_VMD_ALLOW_RETURN)
#define BOOST_VMD_REGISTER_BOOST_VMD_ALLOW_AFTER (BOOST_VMD_ALLOW_AFTER)
#define BOOST_VMD_REGISTER_BOOST_VMD_ALLOW_INDEX (BOOST_VMD_ALLOW_INDEX)
#define BOOST_VMD_DETECT_BOOST_VMD_ALLOW_ALL_BOOST_VMD_ALLOW_ALL
#define BOOST_VMD_DETECT_BOOST_VMD_ALLOW_RETURN_BOOST_VMD_ALLOW_RETURN
#define BOOST_VMD_DETECT_BOOST_VMD_ALLOW_AFTER_BOOST_VMD_ALLOW_AFTER
#define BOOST_VMD_DETECT_BOOST_VMD_ALLOW_INDEX_BOOST_VMD_ALLOW_INDEX
#define BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_TYPE_TUPLE) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_TYPE_ARRAY) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_TYPE_LIST) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_TYPE(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_TYPE) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_NO_TYPE) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_AFTER(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_AFTER) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_ONLY_AFTER) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_NO_AFTER) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_INDEX(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_INDEX) \
/**/
#define BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_RETURN_NO_INDEX) \
/**/
#define BOOST_VMD_DETAIL_IS_ALLOW_ALL(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_ALLOW_ALL) \
/**/
#define BOOST_VMD_DETAIL_IS_ALLOW_RETURN(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_ALLOW_RETURN) \
/**/
#define BOOST_VMD_DETAIL_IS_ALLOW_AFTER(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_ALLOW_AFTER) \
/**/
#define BOOST_VMD_DETAIL_IS_ALLOW_INDEX(id) \
BOOST_VMD_DETAIL_MATCH_SINGLE_IDENTIFIER(id,BOOST_VMD_ALLOW_INDEX) \
/**/
#endif /* BOOST_VMD_DETAIL_MODIFIERS_HPP */

View File

@@ -0,0 +1,707 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_MODS_HPP)
#define BOOST_VMD_DETAIL_MODS_HPP
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/comparison/greater.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/pop_front.hpp>
#include <boost/preprocessor/tuple/push_back.hpp>
#include <boost/preprocessor/tuple/replace.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/preprocessor/variadic/to_tuple.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/is_type.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#define BOOST_VMD_DETAIL_MODS_NO_RETURN 0
#define BOOST_VMD_DETAIL_MODS_RETURN 1
#define BOOST_VMD_DETAIL_MODS_RETURN_TUPLE 2
#define BOOST_VMD_DETAIL_MODS_RETURN_ARRAY 3
#define BOOST_VMD_DETAIL_MODS_RETURN_LIST 4
#define BOOST_VMD_DETAIL_MODS_NO_AFTER 0
#define BOOST_VMD_DETAIL_MODS_RETURN_AFTER 1
#define BOOST_VMD_DETAIL_MODS_NO_INDEX 0
#define BOOST_VMD_DETAIL_MODS_RETURN_INDEX 1
#define BOOST_VMD_DETAIL_MODS_NO_ONLY_AFTER 0
#define BOOST_VMD_DETAIL_MODS_RETURN_ONLY_AFTER 1
#define BOOST_VMD_DETAIL_MODS_TUPLE_RETURN 0
#define BOOST_VMD_DETAIL_MODS_TUPLE_AFTER 1
#define BOOST_VMD_DETAIL_MODS_TUPLE_INDEX 2
#define BOOST_VMD_DETAIL_MODS_TUPLE_OTHER 3
#define BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER 4
#define BOOST_VMD_DETAIL_MODS_TUPLE_TYPE 5
#define BOOST_VMD_DETAIL_MODS_DATA_INPUT 0
#define BOOST_VMD_DETAIL_MODS_DATA_INDEX 1
#define BOOST_VMD_DETAIL_MODS_DATA_SIZE 2
#define BOOST_VMD_DETAIL_MODS_DATA_RESULT 3
#define BOOST_VMD_DETAIL_MODS_DATA_ALLOW 4
#define BOOST_VMD_DETAIL_MODS_STATE_INPUT(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INPUT,state) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_INDEX(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INDEX,state) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_SIZE(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_SIZE,state) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_RESULT(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_RESULT,state) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_ALLOW,state) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state) \
BOOST_VMD_DETAIL_IS_ALLOW_ALL(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state) \
BOOST_VMD_DETAIL_IS_ALLOW_RETURN(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state) \
BOOST_VMD_DETAIL_IS_ALLOW_AFTER(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_INDEX(state) \
BOOST_VMD_DETAIL_IS_ALLOW_INDEX(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_CURRENT(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state),BOOST_VMD_DETAIL_MODS_STATE_INPUT(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_TYPE(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_AFTER(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_ONLY_AFTER(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_STATE_TINDEX(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE(result) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,result) \
/**/
#define BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(result) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,result) \
/**/
#define BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(result) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,result) \
/**/
#define BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(result) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,result) \
/**/
#define BOOST_VMD_DETAIL_MODS_RESULT_OTHER(result) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_OTHER,result) \
/**/
#define BOOST_VMD_DETAIL_MODS_RESULT_TYPE(result) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_TYPE,result) \
/**/
#define BOOST_VMD_DETAIL_MODS_PRED(d,state) \
BOOST_PP_GREATER_D(d,BOOST_VMD_DETAIL_MODS_STATE_SIZE(state),BOOST_VMD_DETAIL_MODS_STATE_INDEX(state))
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,number) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \
number \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \
1 \
), \
BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
1 \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,number) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_INDEX, \
number \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_LIST) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_NO_RETURN) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
BOOST_VMD_DETAIL_MODS_RETURN_AFTER \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \
0 \
), \
BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
BOOST_VMD_DETAIL_MODS_NO_AFTER \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,BOOST_VMD_DETAIL_MODS_RETURN_INDEX) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,BOOST_VMD_DETAIL_MODS_NO_INDEX) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE(d,state,id) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
BOOST_PP_VARIADIC_TO_TUPLE(id) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD(d,state,id) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)), \
id \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE(d,state,id) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD \
) \
(d,state,id) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_MODS_RETURN_ARRAY, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_LIST), \
BOOST_VMD_DETAIL_MODS_RETURN_LIST, \
BOOST_VMD_DETAIL_MODS_RETURN_TUPLE \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE(d,state,id) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id), \
BOOST_VMD_DETAIL_MODS_TUPLE_TYPE, \
id \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \
BOOST_VMD_IS_TYPE_D(d,id) \
), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE \
) \
(d,state,id) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_MODS_DATA_INDEX, \
BOOST_PP_INC(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state)) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL(d,state,id) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
) \
) \
) \
) \
) \
) \
) \
) \
) \
) \
(d,state,id) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN(d,state,id) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
) \
) \
) \
) \
) \
(d,state,id) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER(d,state,id) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
) \
) \
) \
(d,state,id) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX(d,state,id) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \
) \
) \
) \
) \
) \
(d,state,id) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID(d,state,id) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER, \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_INDEX(state), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE \
) \
) \
) \
) \
(d,state,id) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE(d,state,id) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
( \
d, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
id \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,id) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(id), \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE, \
BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID \
) \
(d,state,id) \
/**/
#define BOOST_VMD_DETAIL_MODS_OP(d,state) \
BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,BOOST_VMD_DETAIL_MODS_STATE_CURRENT(state)) \
/**/
#define BOOST_VMD_DETAIL_MODS_LOOP(allow,tuple) \
BOOST_PP_TUPLE_ELEM \
( \
3, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_MODS_PRED, \
BOOST_VMD_DETAIL_MODS_OP, \
( \
tuple, \
0, \
BOOST_PP_TUPLE_SIZE(tuple), \
(0,0,0,,0,), \
allow \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_MODS_LOOP_D(d,allow,tuple) \
BOOST_PP_TUPLE_ELEM \
( \
3, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_MODS_PRED, \
BOOST_VMD_DETAIL_MODS_OP, \
( \
tuple, \
0, \
BOOST_PP_TUPLE_SIZE(tuple), \
(0,0,0,,0,), \
allow \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_NEW_MODS_VAR(allow,tuple) \
BOOST_VMD_DETAIL_MODS_LOOP \
( \
allow, \
BOOST_PP_TUPLE_POP_FRONT(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_NEW_MODS_VAR_D(d,allow,tuple) \
BOOST_VMD_DETAIL_MODS_LOOP_D \
( \
d, \
allow, \
BOOST_PP_TUPLE_POP_FRONT(tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_NEW_MODS_IR(allow,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \
BOOST_VMD_IDENTITY((0,0,0,,0,)), \
BOOST_VMD_DETAIL_NEW_MODS_VAR \
) \
(allow,tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(tuple),1), \
BOOST_VMD_IDENTITY((0,0,0,,0,)), \
BOOST_VMD_DETAIL_NEW_MODS_VAR_D \
) \
(d,allow,tuple) \
) \
/**/
/*
Returns a six-element tuple:
First tuple element = 0 No type return
1 Exact type return
2 General tuple type return
3 Array return
4 List return
Second tuple element = 0 No after return
1 After return
Third tuple element = 0 No identifier index
1 Identifier Index
Fourth tuple element = Tuple of other identifiers
Fifth tuple element = 0 No after only return
1 After only return
Sixth tuple element = Type identifier
Input = allow, either
BOOST_VMD_ALLOW_ALL
BOOST_VMD_ALLOW_RETURN
BOOST_VMD_ALLOW_AFTER
BOOST_VMD_ALLOW_INDEX
..., modifiers, first variadic is discarded
Possible modifiers are:
BOOST_VMD_RETURN_NO_TYPE = (0,0)
BOOST_VMD_RETURN_TYPE = (1,0)
BOOST_VMD_RETURN_TYPE_TUPLE = (2,0)
BOOST_VMD_RETURN_TYPE_ARRAY = (3,0)
BOOST_VMD_RETURN_TYPE_LIST = (4,0)
BOOST_VMD_RETURN_NO_AFTER = (0,0)
BOOST_VMD_RETURN_AFTER = (0,1)
*/
#define BOOST_VMD_DETAIL_NEW_MODS(allow,...) \
BOOST_VMD_DETAIL_NEW_MODS_IR(allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_NEW_MODS_D(d,allow,...) \
BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \
/**/
#endif /* BOOST_VMD_DETAIL_MODS_HPP */

View File

@@ -0,0 +1,13 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_NIL_REGISTRATION_HPP)
#define BOOST_VMD_DETAIL_NIL_REGISTRATION_HPP
#define BOOST_VMD_REGISTER_BOOST_PP_NIL (BOOST_PP_NIL)
#define BOOST_VMD_DETECT_BOOST_PP_NIL_BOOST_PP_NIL
#endif /* BOOST_VMD_DETAIL_NIL_REGISTRATION_HPP */

View File

@@ -0,0 +1,20 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_NOT_EMPTY_HPP)
#define BOOST_VMD_DETAIL_NOT_EMPTY_HPP
#include <boost/preprocessor/logical/compl.hpp>
#include <boost/vmd/is_empty.hpp>
#define BOOST_VMD_DETAIL_NOT_EMPTY(par) \
BOOST_PP_COMPL \
( \
BOOST_VMD_IS_EMPTY(par) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_NOT_EMPTY_HPP */

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,37 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_ONLY_AFTER_HPP)
#define BOOST_VMD_DETAIL_ONLY_AFTER_HPP
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/modifiers.hpp>
/*
Determines whether or not the BOOST_VMD_RETURN_ONLY_AFTER modifiers has been passed
as a variadic parameter.
Returns 1 = BOOST_VMD_RETURN_ONLY_AFTER has been passed
0 = BOOST_VMD_RETURN_ONLY_AFTER has not been passed
*/
#define BOOST_VMD_DETAIL_ONLY_AFTER(...) \
BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_ONLY_AFTER_D(d,...) \
BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_ONLY_AFTER_HPP */

View File

@@ -0,0 +1,54 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_PARENS_HPP)
#define BOOST_VMD_DETAIL_PARENS_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/parens_split.hpp>
#include <boost/vmd/detail/parens_common.hpp>
#define BOOST_VMD_DETAIL_PARENS_PROCESS(vseq) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq), \
BOOST_VMD_DETAIL_BEGIN_PARENS, \
BOOST_VMD_EMPTY \
) \
(vseq) \
/**/
#define BOOST_VMD_DETAIL_PARENS(...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_PARENS_SPLIT, \
BOOST_VMD_DETAIL_PARENS_PROCESS \
) \
(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_PARENS_D(d,...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_PARENS_SPLIT, \
BOOST_VMD_DETAIL_PARENS_PROCESS \
) \
(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#endif /* BOOST_VMD_DETAIL_PARENS_HPP */

View File

@@ -0,0 +1,21 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_PARENS_COMMON_HPP)
#define BOOST_VMD_DETAIL_PARENS_COMMON_HPP
#include <boost/preprocessor/facilities/expand.hpp>
#include <boost/preprocessor/punctuation/paren.hpp>
#include <boost/vmd/empty.hpp>
#define BOOST_VMD_DETAIL_BEGIN_PARENS_EXP2(...) ( __VA_ARGS__ ) BOOST_VMD_EMPTY BOOST_PP_LPAREN()
#define BOOST_VMD_DETAIL_BEGIN_PARENS_EXP1(vseq) BOOST_VMD_DETAIL_BEGIN_PARENS_EXP2 vseq BOOST_PP_RPAREN()
#define BOOST_VMD_DETAIL_BEGIN_PARENS(vseq) BOOST_PP_EXPAND(BOOST_VMD_DETAIL_BEGIN_PARENS_EXP1(vseq))
#define BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq) BOOST_VMD_EMPTY vseq
#define BOOST_VMD_DETAIL_SPLIT_PARENS(vseq) (BOOST_VMD_DETAIL_BEGIN_PARENS(vseq),BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq))
#endif /* BOOST_VMD_DETAIL_PARENS_COMMON_HPP */

View File

@@ -0,0 +1,24 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_PARENS_SPLIT_HPP)
#define BOOST_VMD_DETAIL_PARENS_SPLIT_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/vmd/detail/empty_result.hpp>
#include <boost/vmd/detail/parens_common.hpp>
#define BOOST_VMD_DETAIL_PARENS_SPLIT(vseq) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq), \
BOOST_VMD_DETAIL_SPLIT_PARENS, \
BOOST_VMD_DETAIL_EMPTY_RESULT \
) \
(vseq) \
/**/
#endif /* BOOST_VMD_DETAIL_PARENS_SPLIT_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_1_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_1_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_1_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_1_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_1_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_1_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_1_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_1_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_1_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_10_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_10_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_10_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_10_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_10_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_10_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_10_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_10_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_10_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_11_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_11_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_11_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_11_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_11_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_11_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_11_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_11_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_11_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_12_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_12_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_12_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_12_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_12_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_12_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_12_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_12_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_12_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_13_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_13_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_13_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_13_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_13_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_13_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_13_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_13_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_13_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_14_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_14_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_14_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_14_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_14_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_14_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_14_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_14_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_14_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_15_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_15_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_15_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_15_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_15_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_15_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_15_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_15_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_15_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_16_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_16_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_16_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_16_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_2_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_2_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_2_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_2_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_2_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_2_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_2_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_2_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_2_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_3_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_3_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_3_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_3_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_3_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_3_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_3_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_3_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_3_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_4_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_4_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_4_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_4_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_4_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_4_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_4_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_4_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_4_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_5_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_5_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_5_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_5_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_5_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_5_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_5_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_5_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_5_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_6_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_6_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_6_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_6_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_6_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_6_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_6_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_6_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_6_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_7_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_7_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_7_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_7_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_7_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_7_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_7_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_7_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_7_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_8_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_8_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_8_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_8_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_8_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_8_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_8_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_8_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_8_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_9_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_9_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_9_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_9_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_9_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_9_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_9_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_9_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_9_HPP */

View File

@@ -0,0 +1,22 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_HEADERS_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_HEADERS_HPP
#include <boost/preprocessor/array/size.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/list/size.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/vmd/equal.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/detail/data_equal_common.hpp>
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_HEADERS_HPP */

View File

@@ -0,0 +1,185 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_HPP)
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_HPP
#include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_PARENS(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
BOOST_VMD_IDENTITY(2), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
) \
(d,em1,em2) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_PARENS \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_D(d,state,em1,em2) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_PARENS_D \
) \
(d,em1,em2) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_CMP_D \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_D(d,state) \
BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
( \
d, \
state, \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_TEQ_D(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_LOOP(dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_LOOP_D(d,dataf,datas,sz,vtype) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_OP_D, \
( \
1, \
dataf, \
datas, \
sz, \
vtype, \
0, \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_SZ(dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_LOOP, \
BOOST_VMD_IDENTITY(0) \
) \
(dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_SZ_D(d,dataf,datas,szf,szs,vtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,szf,szs), \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_LOOP_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,dataf,datas,szf,vtype) \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC(dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_SZ \
( \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
vtype \
) \
/**/
#define BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_D(d,dataf,datas,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_SZ_D \
( \
d, \
dataf, \
datas, \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
vtype \
) \
/**/
#endif /* BOOST_VMD_DETAIL_DATA_EQUAL_SPECIFIC_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_1_HPP)
#define BOOST_VMD_DETAIL_EQUAL_1_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_1_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_1, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_1_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_1 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_1_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_1_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_1_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_1_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_1_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_1_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_1_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_1_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_1_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_1_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_1_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_1_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_1_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_1_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_1_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_1_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_1_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_1_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_1_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_1_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_1_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_10_HPP)
#define BOOST_VMD_DETAIL_EQUAL_10_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_10_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_10, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_10_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_10 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_10_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_10_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_10_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_10_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_10_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_10_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_10_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_10_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_10_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_10_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_10_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_10_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_10_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_10_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_10_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_10_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_10_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_10_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_10_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_10_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_10_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_11_HPP)
#define BOOST_VMD_DETAIL_EQUAL_11_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_11_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_11, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_11_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_11 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_11_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_11_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_11_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_11_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_11_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_11_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_11_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_11_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_11_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_11_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_11_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_11_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_11_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_11_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_11_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_11_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_11_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_11_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_11_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_11_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_11_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_12_HPP)
#define BOOST_VMD_DETAIL_EQUAL_12_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_12_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_12, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_12_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_12 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_12_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_12_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_12_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_12_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_12_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_12_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_12_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_12_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_12_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_12_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_12_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_12_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_12_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_12_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_12_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_12_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_12_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_12_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_12_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_12_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_12_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_13_HPP)
#define BOOST_VMD_DETAIL_EQUAL_13_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_13_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_13, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_13_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_13 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_13_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_13_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_13_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_13_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_13_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_13_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_13_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_13_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_13_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_13_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_13_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_13_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_13_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_13_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_13_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_13_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_13_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_13_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_13_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_13_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_13_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_14_HPP)
#define BOOST_VMD_DETAIL_EQUAL_14_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_14_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_14, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_14_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_14 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_14_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_14_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_14_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_14_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_14_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_14_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_14_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_14_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_14_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_14_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_14_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_14_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_14_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_14_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_14_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_14_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_14_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_14_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_14_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_14_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_14_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_15_HPP)
#define BOOST_VMD_DETAIL_EQUAL_15_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_15_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_15, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_15_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_15 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_15_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_15_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_15_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_15_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_15_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_15_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_15_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_15_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_15_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_15_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_15_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_15_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_15_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_15_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_15_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_15_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_15_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_15_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_15_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_15_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_15_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_16_HPP)
#define BOOST_VMD_DETAIL_EQUAL_16_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_16_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_16, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_16_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_16 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_16_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_16_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_16_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_16_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_16_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_16_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_16_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_16_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_16_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_16_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_16_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_16_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_16_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_16_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_16_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_16_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_16_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_16_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_16_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_16_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_16_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_2_HPP)
#define BOOST_VMD_DETAIL_EQUAL_2_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_2_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_2, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_2_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_2 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_2_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_2_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_2_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_2_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_2_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_2_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_2_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_2_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_2_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_2_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_2_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_2_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_2_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_2_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_2_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_2_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_2_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_2_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_2_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_2_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_2_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_3_HPP)
#define BOOST_VMD_DETAIL_EQUAL_3_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_3, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_3_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_3 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_3_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_3_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_3_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_3_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_3_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_3_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_3_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_3_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_3_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_3_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_3_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_3_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_3_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_3_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_3_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_4_HPP)
#define BOOST_VMD_DETAIL_EQUAL_4_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_4_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_4, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_4_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_4 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_4_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_4_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_4_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_4_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_4_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_4_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_4_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_4_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_4_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_4_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_4_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_4_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_4_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_4_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_4_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_4_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_4_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_4_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_4_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_4_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_4_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_5_HPP)
#define BOOST_VMD_DETAIL_EQUAL_5_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_5_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_5, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_5_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_5 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_5_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_5_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_5_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_5_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_5_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_5_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_5_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_5_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_5_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_5_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_5_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_5_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_5_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_5_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_5_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_5_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_5_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_5_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_5_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_5_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_5_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_6_HPP)
#define BOOST_VMD_DETAIL_EQUAL_6_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_6_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_6, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_6_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_6 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_6_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_6_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_6_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_6_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_6_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_6_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_6_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_6_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_6_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_6_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_6_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_6_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_6_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_6_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_6_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_6_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_6_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_6_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_6_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_6_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_6_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_7_HPP)
#define BOOST_VMD_DETAIL_EQUAL_7_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_7, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_7_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_7 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_7_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_7_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_7_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_7_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_7_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_7_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_7_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_7_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_7_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_7_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_7_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_7_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_7_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_7_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_7_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_7_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_7_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_8_HPP)
#define BOOST_VMD_DETAIL_EQUAL_8_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_8_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_8, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_8_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_8 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_8_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_8_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_8_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_8_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_8_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_8_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_8_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_8_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_8_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_8_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_8_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_8_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_8_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_8_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_8_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_8_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_8_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_8_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_8_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_8_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_8_HPP */

View File

@@ -0,0 +1,282 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_9_HPP)
#define BOOST_VMD_DETAIL_EQUAL_9_HPP
#include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
#define BOOST_VMD_DETAIL_EQUAL_9_CNI_CHK(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_9, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_CNI_CHK_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
), \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
) \
), \
BOOST_VMD_DETAIL_DATA_EQUAL_9_D, \
BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_VSEQ(vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_9 \
( \
BOOST_VMD_TO_SEQ(vseq1), \
BOOST_VMD_TO_SEQ(vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_VSEQ_D(d,vseq1,vseq2,vtype) \
BOOST_VMD_DETAIL_DATA_EQUAL_9_D \
( \
d, \
BOOST_VMD_TO_SEQ_D(d,vseq1), \
BOOST_VMD_TO_SEQ_D(d,vseq2), \
BOOST_VMD_TYPE_SEQ \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_CNI(vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_9_VSEQ, \
BOOST_VMD_DETAIL_EQUAL_9_CNI_CHK \
) \
(vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_CNI_D(d,vseq1,vseq2,vtype) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype, \
BOOST_VMD_TYPE_SEQUENCE \
), \
BOOST_VMD_DETAIL_EQUAL_9_VSEQ_D, \
BOOST_VMD_DETAIL_EQUAL_9_CNI_CHK_D \
) \
(d,vseq1,vseq2,vtype) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_9_CNI, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
vtype1, \
vtype2 \
), \
BOOST_VMD_DETAIL_EQUAL_9_CNI_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2,vtype1) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_9_WT_CHECK \
( \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_DETAIL_EQUAL_9_WT_CHECK_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_WT(vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_9_WT_CONVERT \
) \
(vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_EQUAL_9_WT_CONVERT_D \
) \
(d,vseq1,vseq2,vtype1,vtype2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_GTYPE(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_9_WT \
( \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_GTYPE_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_9_WT_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_EBP(vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_9_GTYPE, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_EBP_D(d,vseq1,vseq2,be1,be2) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
), \
BOOST_VMD_DETAIL_EQUAL_9_GTYPE_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq1,vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_EMPTY(vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_9_EBP \
) \
(vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_EMPTY_D(d,vseq1,vseq2,be1,be2) \
BOOST_PP_IIF \
( \
BOOST_PP_BITAND(be1,be2), \
BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
BOOST_VMD_DETAIL_EQUAL_9_EBP_D \
) \
(d,vseq1,vseq2,be1,be2) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9(vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_9_EMPTY \
( \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#define BOOST_VMD_DETAIL_EQUAL_9_D(d,vseq1,vseq2) \
BOOST_VMD_DETAIL_EQUAL_9_EMPTY_D \
( \
d, \
vseq1, \
vseq2, \
BOOST_VMD_IS_EMPTY(vseq1), \
BOOST_VMD_IS_EMPTY(vseq2) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_EQUAL_9_HPP */

View File

@@ -0,0 +1,23 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_EQUAL_HEADERS_HPP)
#define BOOST_VMD_DETAIL_EQUAL_HEADERS_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/logical/bitand.hpp>
#include <boost/vmd/to_seq.hpp>
#include <boost/vmd/get_type.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/adjust_tuple_type.hpp>
#include <boost/vmd/detail/data_equal.hpp>
#include <boost/vmd/detail/equal_common.hpp>
#include <boost/vmd/detail/equal_type.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#endif /* BOOST_VMD_DETAIL_EQUAL_HEADERS_HPP */

View File

@@ -0,0 +1,236 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQ_HPP)
#define BOOST_VMD_DETAIL_SEQ_HPP
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/facilities/empty.hpp>
#include <boost/preprocessor/seq/push_back.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/push_back.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/empty_result.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/parens.hpp>
#define BOOST_VMD_DETAIL_SEQ_STATE_INIT(seq) \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_VMD_DETAIL_PARENS(seq,BOOST_VMD_RETURN_AFTER), \
BOOST_PP_EMPTY() \
), \
BOOST_PP_EMPTY() \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_INIT_D(d,seq) \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_VMD_DETAIL_PARENS_D(d,seq,BOOST_VMD_RETURN_AFTER), \
BOOST_PP_EMPTY() \
), \
BOOST_PP_EMPTY() \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_PRED(d,state) \
BOOST_VMD_DETAIL_NOT_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(0,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_FAILURE(d,state) \
( \
BOOST_PP_EMPTY(), \
BOOST_PP_EMPTY(), \
BOOST_PP_TUPLE_ELEM(2,state), \
BOOST_PP_TUPLE_ELEM(3,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_OP_MAKE_SEQ(d,state) \
BOOST_PP_TUPLE_ELEM(0,state) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_OP_UPGRADE_SEQ(d,state) \
BOOST_PP_SEQ_PUSH_BACK \
( \
BOOST_PP_TUPLE_ELEM(2,state), \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_TUPLE_ELEM(0,state) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_SUCCESS(d,state) \
( \
BOOST_PP_EMPTY(), \
BOOST_PP_EMPTY(), \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(2,state) \
), \
BOOST_VMD_DETAIL_SEQ_STATE_OP_MAKE_SEQ, \
BOOST_VMD_DETAIL_SEQ_STATE_OP_UPGRADE_SEQ \
) \
(d,state), \
BOOST_PP_EMPTY() \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_CONTINUE(d,state) \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_VMD_DETAIL_PARENS_D(d,BOOST_PP_TUPLE_ELEM(1,state),BOOST_VMD_RETURN_AFTER), \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(2,state) \
), \
BOOST_VMD_DETAIL_SEQ_STATE_OP_MAKE_SEQ, \
BOOST_VMD_DETAIL_SEQ_STATE_OP_UPGRADE_SEQ \
) \
(d,state) \
), \
BOOST_PP_TUPLE_ELEM(1,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_OP_CHECK_REST(d,state) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(1,state) \
), \
BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_SUCCESS, \
BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_CONTINUE \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_OP(d,state) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D \
( \
d, \
1, \
BOOST_PP_TUPLE_SIZE \
( \
BOOST_PP_TUPLE_ELEM(0,state) \
) \
), \
BOOST_VMD_DETAIL_SEQ_STATE_OP_CHECK_REST, \
BOOST_VMD_DETAIL_SEQ_STATE_OP_SET_FAILURE \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_SEQ_STATE_RESULT(state) \
( \
BOOST_PP_TUPLE_ELEM(2,state), \
BOOST_PP_TUPLE_ELEM(3,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_PROCESS(seq) \
BOOST_VMD_DETAIL_SEQ_STATE_RESULT \
( \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_SEQ_STATE_PRED, \
BOOST_VMD_DETAIL_SEQ_STATE_OP, \
BOOST_VMD_DETAIL_SEQ_STATE_INIT(seq) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_SPLIT(seq) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(seq), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_SEQ_PROCESS \
) \
(seq) \
/**/
#define BOOST_VMD_DETAIL_SEQ_BEGIN(seq) \
BOOST_PP_TUPLE_ELEM(0,BOOST_VMD_DETAIL_SEQ_SPLIT(seq)) \
/**/
#define BOOST_VMD_DETAIL_SEQ_PROCESS_D(d,seq) \
BOOST_VMD_DETAIL_SEQ_STATE_RESULT \
( \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_SEQ_STATE_PRED, \
BOOST_VMD_DETAIL_SEQ_STATE_OP, \
BOOST_VMD_DETAIL_SEQ_STATE_INIT_D(d,seq) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQ_SPLIT_D(d,seq) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(seq), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_SEQ_PROCESS_D \
) \
(d,seq) \
/**/
#define BOOST_VMD_DETAIL_SEQ_BEGIN_D(d,seq) \
BOOST_PP_TUPLE_ELEM(0,BOOST_VMD_DETAIL_SEQ_SPLIT_D(d,seq)) \
/**/
#define BOOST_VMD_DETAIL_SEQ_D(d,...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_SEQ_SPLIT_D, \
BOOST_VMD_DETAIL_SEQ_BEGIN_D \
) \
(d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_SEQ(...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_SEQ_SPLIT, \
BOOST_VMD_DETAIL_SEQ_BEGIN \
) \
(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQ_HPP */

View File

@@ -0,0 +1,66 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_ARITY_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_ARITY_HPP
#include <boost/preprocessor/logical/bitand.hpp>
#include <boost/preprocessor/logical/bitnor.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/sequence_elem.hpp>
#define BOOST_VMD_DETAIL_IS_MULTI_TUPLE(tuple) \
BOOST_PP_BITNOR \
( \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_UNARY_TUPLE(tuple) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)) \
) \
/**/
// UNARY
#define BOOST_VMD_DETAIL_IS_UNARY(vseq) \
BOOST_VMD_DETAIL_IS_UNARY_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM(BOOST_VMD_ALLOW_AFTER,0,vseq,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_UNARY_D(d,vseq) \
BOOST_VMD_DETAIL_IS_UNARY_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,BOOST_VMD_ALLOW_AFTER,0,vseq,BOOST_VMD_RETURN_AFTER) \
) \
/**/
// MULTI
#define BOOST_VMD_DETAIL_IS_MULTI(vseq) \
BOOST_VMD_DETAIL_IS_MULTI_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM(BOOST_VMD_ALLOW_AFTER,0,vseq,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_IS_MULTI_D(d,vseq) \
BOOST_VMD_DETAIL_IS_MULTI_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,BOOST_VMD_ALLOW_AFTER,0,vseq,BOOST_VMD_RETURN_AFTER) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_ARITY_HPP */

View File

@@ -0,0 +1,766 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_COMMON_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_COMMON_HPP
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/array/push_back.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/comparison/less_equal.hpp>
#include <boost/preprocessor/comparison/not_equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/control/while.hpp>
#include <boost/preprocessor/list/append.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/seq/push_back.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/push_back.hpp>
#include <boost/preprocessor/tuple/replace.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/is_empty_list.hpp>
#include <boost/vmd/detail/array.hpp>
#include <boost/vmd/detail/equal_type.hpp>
#include <boost/vmd/detail/identifier.hpp>
#include <boost/vmd/detail/identifier_type.hpp>
#include <boost/vmd/detail/list.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/seq.hpp>
#include <boost/vmd/detail/tuple.hpp>
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT_ELEM 0
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ELEM 1
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM_ELEM 2
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE_ELEM 3
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM_ELEM 4
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES_ELEM 5
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX_ELEM 6
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT_ELEM,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ELEM,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM_ELEM,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE_ELEM,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM_ELEM,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,number) \
BOOST_PP_EQUAL_D \
( \
d, \
BOOST_PP_TUPLE_ELEM(0,from), \
number \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_NO_RETURN(d,from) \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_NO_RETURN) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_EXACT_RETURN(d,from) \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_RETURN) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_GENERAL_RETURN(d,from) \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_ARRAY_RETURN(d,from) \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_LIST_RETURN(d,from) \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_RETURN(d,from,BOOST_VMD_DETAIL_MODS_RETURN_LIST) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(from) \
BOOST_PP_EQUAL \
( \
BOOST_PP_TUPLE_ELEM(1,from), \
BOOST_VMD_DETAIL_MODS_RETURN_AFTER \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,from) \
BOOST_PP_EQUAL_D \
( \
d, \
BOOST_PP_TUPLE_ELEM(1,from), \
BOOST_VMD_DETAIL_MODS_RETURN_AFTER \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES_ELEM,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state) \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX_ELEM,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_IS_EMPTY(state) \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_FROM_EMPTY(state,data) \
(data) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_TO_SEQ(state,data) \
BOOST_PP_SEQ_PUSH_BACK(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state),data) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_TO_TUPLE(state,data) \
BOOST_PP_TUPLE_PUSH_BACK(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state),data) \
/**/
// Array
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_BOOST_VMD_TYPE_ARRAY(d,state,data) \
BOOST_PP_ARRAY_PUSH_BACK(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state),data) \
/**/
// List
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_BOOST_VMD_TYPE_LIST(d,state,data) \
BOOST_PP_LIST_APPEND_D(d,BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state),(data,BOOST_PP_NIL)) \
/**/
// Seq
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_BOOST_VMD_TYPE_SEQ(d,state,data) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_IS_EMPTY(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_FROM_EMPTY, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_TO_SEQ \
) \
(state,data) \
/**/
// Tuple
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_BOOST_VMD_TYPE_TUPLE(d,state,data) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_IS_EMPTY(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_FROM_EMPTY, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_TO_TUPLE \
) \
(state,data) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_GET_NAME(state) \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_PROCESS(d,name,state,data) \
name(d,state,data) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_GET_DATA(d,state,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_NO_RETURN \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
), \
BOOST_PP_TUPLE_ELEM, \
BOOST_VMD_IDENTITY(tuple) \
) \
(1,tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD(d,state,ttuple) \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_PROCESS \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_GET_NAME(state), \
state, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD_GET_DATA(d,state,ttuple) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_PROCESSING_ELEM_CHECK(d,state) \
BOOST_PP_EQUAL_D \
( \
d, \
BOOST_PP_SEQ_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state)), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_PROCESSING_ELEM(d,state) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state)), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_SEQUENCE_PROCESSING_ELEM_CHECK \
) \
(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE(state) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state),BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state)) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE_REENTRANT(state) \
BOOST_PP_TUPLE_ELEM \
( \
1, \
BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state),BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state)) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_UNKNOWN(d,state) \
( \
, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD(d,state,(BOOST_VMD_TYPE_UNKNOWN,BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state))), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state), \
BOOST_PP_INC(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state)) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE_CHECK_ID(d,type,id) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,type,BOOST_VMD_TYPE_IDENTIFIER), \
BOOST_VMD_DETAIL_IDENTIFIER_TYPE_D, \
BOOST_VMD_IDENTITY(type) \
) \
(d,id) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE(d,state,tuple) \
BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE_CHECK_ID \
( \
d, \
BOOST_PP_CAT \
( \
BOOST_VMD_TYPE_, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE(state) \
), \
BOOST_PP_TUPLE_ELEM(0,tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_PROCESS(d,state,tuple) \
( \
BOOST_PP_TUPLE_ELEM(1,tuple), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD \
( \
d, \
state, \
( \
BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE(d,state,tuple), \
BOOST_PP_TUPLE_ELEM(0,tuple) \
) \
), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state), \
BOOST_PP_INC(BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state))) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_SEQ_SINGLE(d,tuple) \
BOOST_PP_EQUAL_D(d,BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(0,tuple)),1) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_SEQ(d,state,tuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_GET_FULL_TYPE(d,state,tuple), \
BOOST_VMD_TYPE_SEQ \
), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_SEQ_SINGLE, \
BOOST_VMD_IDENTITY(0) \
) \
(d,tuple) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND(d,state,tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_SEQ(d,state,tuple), \
BOOST_VMD_DETAIL_SEQUENCE_INCREMENT_INDEX, \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND_PROCESS \
) \
(d,state,tuple) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_INCREMENT_INDEX(d,state,tuple) \
BOOST_PP_TUPLE_REPLACE_D(d,state,BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX_ELEM,BOOST_PP_INC(BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state))) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_TUPLE(d,state,tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(0,tuple) \
), \
BOOST_VMD_DETAIL_SEQUENCE_INCREMENT_INDEX, \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_FOUND \
) \
(d,state,tuple) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE(d,call,state) \
BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_TUPLE \
( \
d, \
state, \
call(BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state),BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_D(d,call,state) \
BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_TUPLE \
( \
d, \
state, \
call(d,BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state),BOOST_VMD_RETURN_AFTER) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_GCLRT(state) \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_, \
BOOST_PP_CAT(BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE(state),_D) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_GCLPL(state) \
BOOST_PP_CAT \
( \
BOOST_VMD_DETAIL_, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_GCL(state,rflag) \
BOOST_PP_IIF \
( \
rflag, \
BOOST_VMD_DETAIL_SEQUENCE_GCLRT, \
BOOST_VMD_DETAIL_SEQUENCE_GCLPL \
) \
(state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_RT_CALL(d,call,state,rflag) \
BOOST_PP_IIF \
( \
rflag, \
BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE_D, \
BOOST_VMD_DETAIL_SEQUENCE_TEST_TYPE \
) \
(d,call,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_RT(d,state,rflag) \
BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_RT_CALL \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_GCL(state,rflag), \
state, \
rflag \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST(d,state) \
BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST_RT \
( \
d, \
state, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_GET_TYPE_REENTRANT(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_INNER_OP(d,state) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state), \
BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state)) \
), \
BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_UNKNOWN, \
BOOST_VMD_DETAIL_SEQUENCE_INNER_OP_TEST \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_INNER_PRED(d,state) \
BOOST_PP_NOT_EQUAL_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_INDEX(state), \
BOOST_PP_INC(BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_TYPES(state))) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM_FROM(d,from) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_GENERAL_RETURN(d,from), \
((SEQ,1),(TUPLE,1)), \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_EXACT_RETURN(d,from), \
((SEQ,1),(LIST,1),(ARRAY,1),(TUPLE,1)), \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_ARRAY_RETURN(d,from), \
((SEQ,1),(ARRAY,1),(TUPLE,1)), \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_LIST_RETURN(d,from), \
((SEQ,1),(LIST,1),(TUPLE,1)), \
((SEQ,1),(TUPLE,1)) \
) \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM(d,state) \
BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM_FROM \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ANY(d,state) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
), \
BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM, \
BOOST_VMD_IDENTITY(((SEQ,1),(TUPLE,1))) \
) \
(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES(d,state) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_PROCESSING_ELEM(d,state), \
BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ELEM, \
BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES_ANY \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN(d,state) \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_SEQUENCE_INNER_PRED, \
BOOST_VMD_DETAIL_SEQUENCE_INNER_OP, \
BOOST_PP_TUPLE_PUSH_BACK \
( \
BOOST_PP_TUPLE_PUSH_BACK \
( \
state, \
BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN_TUPLE_TYPES(d,state) \
), \
0 \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_ID_LOOP(d,state) \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_SEQUENCE_INNER_PRED, \
BOOST_VMD_DETAIL_SEQUENCE_INNER_OP, \
BOOST_PP_TUPLE_PUSH_BACK(BOOST_PP_TUPLE_PUSH_BACK(state,((IDENTIFIER,1))),0) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_ID_EL(d,state) \
( \
BOOST_PP_TUPLE_ELEM(1,BOOST_VMD_DETAIL_LIST_D(d,BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state),BOOST_VMD_RETURN_AFTER)), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT_ADD(d,state,(BOOST_VMD_TYPE_LIST,BOOST_PP_NIL)), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_ID(d,state) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY_LIST_D \
( \
d, \
BOOST_VMD_DETAIL_IDENTIFIER_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
) \
), \
BOOST_VMD_DETAIL_SEQUENCE_OP_ID_EL, \
BOOST_VMD_DETAIL_SEQUENCE_OP_ID_LOOP \
) \
(d,state) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP_REDUCE_STATE(state) \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_OUTTYPE(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_OP(d,state) \
BOOST_VMD_DETAIL_SEQUENCE_OP_REDUCE_STATE \
( \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
), \
BOOST_VMD_DETAIL_SEQUENCE_OP_PAREN, \
BOOST_VMD_DETAIL_SEQUENCE_OP_ID \
) \
(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_PRED_CELEM_SZ(d,state) \
BOOST_PP_LESS_EQUAL_D \
( \
d, \
BOOST_PP_SEQ_SIZE(BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state)), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_PRED_CELEM(d,state) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_ELEM(state) \
), \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
) \
), \
BOOST_VMD_IDENTITY(1), \
BOOST_VMD_DETAIL_SEQUENCE_PRED_CELEM_SZ \
) \
(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_PRED(d,state) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
), \
BOOST_VMD_IDENTITY(0), \
BOOST_VMD_DETAIL_SEQUENCE_PRED_CELEM \
) \
(d,state) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_CHECK(output) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(output,BOOST_VMD_TYPE_ARRAY), \
(0,()), \
BOOST_PP_NIL \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_CHECK_D(d,output) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,output,BOOST_VMD_TYPE_ARRAY), \
(0,()), \
BOOST_PP_NIL \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE(output) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(output,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE(output,BOOST_VMD_TYPE_TUPLE) \
), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_CHECK \
) \
(output) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_D(d,output) \
BOOST_PP_IIF \
( \
BOOST_PP_BITOR \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,output,BOOST_VMD_TYPE_SEQ), \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,output,BOOST_VMD_TYPE_TUPLE) \
), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_CHECK_D \
) \
(d,output) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_GET(state) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
), \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
)
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_GET_D(d,state) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_STATE_FROM(state) \
), \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_INPUT(state) \
), \
BOOST_VMD_DETAIL_SEQUENCE_STATE_RESULT(state) \
)
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE(vseq,elem,output,from) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_GET \
( \
BOOST_PP_WHILE \
( \
BOOST_VMD_DETAIL_SEQUENCE_PRED, \
BOOST_VMD_DETAIL_SEQUENCE_OP, \
( \
vseq, \
BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE \
( \
output \
), \
elem, \
output, \
from \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D(d,vseq,elem,output,from) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_GET_D \
( \
d, \
BOOST_PP_WHILE_ ## d \
( \
BOOST_VMD_DETAIL_SEQUENCE_PRED, \
BOOST_VMD_DETAIL_SEQUENCE_OP, \
( \
vseq, \
BOOST_VMD_DETAIL_SEQUENCE_EMPTY_TYPE_D \
( \
d, \
output \
), \
elem, \
output, \
from \
) \
) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_COMMON_HPP */

View File

@@ -0,0 +1,985 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP
#include <boost/preprocessor/arithmetic/dec.hpp>
#include <boost/preprocessor/comparison/greater.hpp>
#include <boost/preprocessor/control/expr_if.hpp>
#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/preprocessor/control/if.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/logical/bitand.hpp>
#include <boost/preprocessor/logical/bitor.hpp>
#include <boost/preprocessor/logical/compl.hpp>
#include <boost/preprocessor/seq/elem.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/tuple/push_back.hpp>
#include <boost/preprocessor/tuple/replace.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/is_identifier.hpp>
#include <boost/vmd/detail/empty_result.hpp>
#include <boost/vmd/detail/equal_type.hpp>
#include <boost/vmd/detail/match_identifier.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/only_after.hpp>
#include <boost/vmd/detail/sequence_common.hpp>
/*
Given modifications and the requested type,
determine whether or not we should be checking for specific identifiers
1 = check for specific identifiers
0 = do no check for specific identifiers
*/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
type, \
BOOST_VMD_TYPE_IDENTIFIER \
), \
BOOST_VMD_DETAIL_NOT_EMPTY \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
type, \
BOOST_VMD_TYPE_IDENTIFIER \
), \
BOOST_VMD_DETAIL_NOT_EMPTY \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
) \
) \
/**/
/*
Given modifications, determine whether or not an index should be part of the result
1 = index should be part of the result
0 = index should not be part of the result
*/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT(nm) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm), \
BOOST_VMD_TYPE_IDENTIFIER \
), \
BOOST_VMD_DETAIL_NOT_EMPTY \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT_D(d,nm) \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
BOOST_PP_BITAND \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm), \
BOOST_VMD_TYPE_IDENTIFIER \
), \
BOOST_VMD_DETAIL_NOT_EMPTY \
( \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX(nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(nm), \
(,,), \
(,) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX(nm) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(nm), \
(,) \
) \
/**/
/*
Returns a failure result given the modifications
*/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX \
) \
(nm),nm, \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_IS_INDEX_RESULT_D(d,nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_INDEX, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_NO_INDEX \
) \
(nm),nm, \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE(res) \
BOOST_PP_TUPLE_ELEM \
( \
0, \
BOOST_PP_TUPLE_ELEM(0,res) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY(res) \
BOOST_PP_TUPLE_ELEM(0,res) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE(res) \
BOOST_PP_TUPLE_ELEM \
( \
1, \
BOOST_PP_TUPLE_ELEM(0,res) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY(res) \
BOOST_PP_TUPLE_ELEM(1,res) \
/**/
/*
Gets the 'data' of the result given the result and modifications
*/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY \
) \
(res) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_TUPLE, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_ONLY \
) \
(res) \
/**/
/*
Gets the 'type' of the result given the result and modifications
*/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE(res,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY \
) \
(res) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_D(d,res,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_TUPLE, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_ONLY \
) \
(res) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE(res) \
BOOST_VMD_IS_EMPTY \
( \
BOOST_PP_TUPLE_ELEM(0,res) \
) \
/**/
/*
Determines whether the result from the element access has failed or not
returns 1 if it has failed, otherwise 0.
*/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED(res,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE, \
BOOST_VMD_IS_EMPTY \
) \
(res) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_D(d,res,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_TUPLE, \
BOOST_VMD_IS_EMPTY \
) \
(res) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM(seq,elem) \
BOOST_PP_IIF \
( \
BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(seq),elem), \
BOOST_PP_SEQ_ELEM, \
BOOST_VMD_EMPTY \
) \
(elem,seq) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM_D(d,seq,elem) \
BOOST_PP_IIF \
( \
BOOST_PP_GREATER_D(d,BOOST_PP_SEQ_SIZE(seq),elem), \
BOOST_PP_SEQ_ELEM, \
BOOST_VMD_EMPTY \
) \
(elem,seq) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES(data,elem) \
( \
BOOST_PP_SEQ_ELEM(elem,BOOST_PP_TUPLE_ELEM(0,data)), \
BOOST_PP_TUPLE_ELEM(1,data) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM(data,elem) \
BOOST_PP_IIF \
( \
BOOST_PP_GREATER(BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(0,data)),elem), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES, \
BOOST_VMD_DETAIL_EMPTY_RESULT \
) \
(data,elem) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_D(d,data,elem) \
BOOST_PP_IIF \
( \
BOOST_PP_GREATER_D(d,BOOST_PP_SEQ_SIZE(BOOST_PP_TUPLE_ELEM(0,data)),elem), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_RES, \
BOOST_VMD_DETAIL_EMPTY_RESULT \
) \
(data,elem) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY(seq,elem) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(seq), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM \
) \
(seq,elem) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_D(d,seq,elem) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(seq), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_CHELM_D \
) \
(d,seq,elem) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER(data,elem) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,data)), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM \
) \
(data,elem) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_D(d,data,elem) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,data)), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_CHELM_D \
) \
(d,data,elem) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ(seq,elem,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY \
) \
(seq,elem) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_D(d,seq,elem,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_AFTER_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_ONLY_D \
) \
(d,seq,elem) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(...) \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS(elem,vseq,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
( \
vseq, \
elem, \
BOOST_VMD_TYPE_SEQ, \
nm \
), \
elem, \
nm \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS_D(d,elem,vseq,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FSEQ_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
( \
d, \
vseq, \
elem, \
BOOST_VMD_TYPE_SEQ, \
nm \
), \
elem, \
nm \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY(elem,vseq,nm) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
(,) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY_D(d,elem,vseq,nm) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
(,) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE(elem,vseq,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(vseq), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY \
) \
(elem,vseq,nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE_D(d,elem,vseq,nm) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(vseq), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PROCESS_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_EMPTY_D \
) \
(d,elem,vseq,nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D(d,res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN(res,nm,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
BOOST_PP_TUPLE_ELEM, \
BOOST_VMD_IDENTITY(res) \
) \
(1,res) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_INDEX_JRES(data,index) \
BOOST_PP_IF \
( \
index, \
(data,BOOST_PP_DEC(index)), \
(,) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_JRES(data,index) \
BOOST_PP_EXPR_IF \
( \
index, \
data \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH(data,nm,index) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_INDEX_JRES, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_JRES \
) \
(data,index) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP(data,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH \
( \
data, \
nm, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER \
( \
data, \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP_D(d,data,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_MATCH \
( \
data, \
nm, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D \
( \
d, \
data, \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID(data,nm,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP, \
BOOST_VMD_IDENTITY(data) \
) \
(data,nm) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_D(d,data,nm,type) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_TUP_D, \
BOOST_VMD_IDENTITY(data) \
) \
(d,data,nm) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY(res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID \
( \
BOOST_PP_TUPLE_ELEM(1,res), \
nm, \
type \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_D(d,res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_ID_D \
( \
d, \
BOOST_PP_TUPLE_ELEM(1,res), \
nm, \
type \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE(res,nm,type) \
BOOST_PP_TUPLE_REPLACE \
( \
res, \
0, \
BOOST_PP_TUPLE_ELEM \
( \
1, \
BOOST_PP_TUPLE_ELEM(0,res) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE_D(d,res,nm,type) \
BOOST_PP_TUPLE_REPLACE_D \
( \
d, \
res, \
0, \
BOOST_PP_TUPLE_ELEM \
( \
1, \
BOOST_PP_TUPLE_ELEM(0,res) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER(res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE \
) \
(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D(d,res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_CHANGE_D \
) \
(d,res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS(res,nm,type,index) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER \
( \
BOOST_PP_TUPLE_PUSH_BACK(res,BOOST_PP_DEC(index)), \
nm, \
type \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS_D(d,res,nm,type,index) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D \
( \
d, \
BOOST_PP_TUPLE_PUSH_BACK(res,BOOST_PP_DEC(index)), \
nm, \
type \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE(res,nm,type,index) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE_D(d,res,nm,type,index) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES(res,nm,type,index) \
BOOST_PP_IF \
( \
index, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE \
) \
(res,nm,type,index) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES_D(d,res,nm,type,index) \
BOOST_PP_IF \
( \
index, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_SUCCESS_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_FAILURE_D \
) \
(d,res,nm,type,index) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE(res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE_D(d,res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES(res,nm,type,index) \
BOOST_PP_IF \
( \
index, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE \
) \
(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_D(d,res,nm,type,index) \
BOOST_PP_IF \
( \
index, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_FAILURE_D \
) \
(d,res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES(res,nm,type,index) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES \
) \
(res,nm,type,index) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES_D(d,res,nm,type,index) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_INDEX_JRES_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_JRES_D \
) \
(d,res,nm,type,index) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID(res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES \
( \
res, \
nm, \
type, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm), \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_D(d,res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_RES_D \
( \
d, \
res, \
nm, \
type, \
BOOST_VMD_DETAIL_MATCH_IDENTIFIER_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm), \
BOOST_VMD_DETAIL_MODS_RESULT_OTHER(nm) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT(res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS(nm,type), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER \
) \
(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_D(d,res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_CHECK_FOR_IDENTIFIERS_D(d,nm,type), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ID_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_ONLY_CAFTER_D \
) \
(d,res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK(res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER(nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY \
) \
(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_D(d,res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_STATE_IS_AFTER_D(d,nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_SPLIT_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_ONLY_D \
) \
(d,res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED(res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED_D(d,res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID(res,nm,type) \
BOOST_VMD_IS_IDENTIFIER \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA(res,nm) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID_D(d,res,nm,type) \
BOOST_VMD_IS_IDENTIFIER_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_DATA_D(d,res,nm) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER(res,nm,type) \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE(res,nm), \
type \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER_D(d,res,nm,type) \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_RESULT_TYPE_D(d,res,nm), \
type \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE(res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_TYPE_IDENTIFIER, \
type \
), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER \
) \
(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_D(d,res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_TYPE_IDENTIFIER, \
type \
), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_ID_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_OTHER_D \
) \
(d,res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT(res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE(res,nm,type), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED \
) \
(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_D(d,res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_MATCHING_TYPE_D(d,res,nm,type), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_CHECK_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_FAILED_D \
) \
(d,res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF(res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(type), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT \
) \
(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF_D(d,res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(type), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_FIN_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_PT_D \
) \
(d,res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED(res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT(nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED_D(d,res,nm,type) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_FAILURE_RESULT_D(d,nm) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE(res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED(res,nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF \
) \
(res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_D(d,res,nm,type) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_HAS_FAILED_D(d,res,nm), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_FAILED_D, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_NF_D \
) \
(d,res,nm,type) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA(res,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE \
( \
res, \
nm, \
BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA_D(d,res,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_TYPE_D \
( \
d, \
res, \
nm, \
BOOST_VMD_DETAIL_MODS_RESULT_TYPE(nm) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM(elem,vseq,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE(elem,vseq,nm), \
nm \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_D(d,elem,vseq,nm) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_COA_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_CE_D(d,elem,vseq,nm), \
nm \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM(allow,elem,...) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM \
( \
elem, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
BOOST_VMD_DETAIL_NEW_MODS(allow,__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,allow,elem,...) \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_NM_D \
( \
d, \
elem, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
BOOST_VMD_DETAIL_NEW_MODS_D(d,allow,__VA_ARGS__) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_ELEM_HPP */

View File

@@ -0,0 +1,40 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_ENUM_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_ENUM_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/tuple/enum.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/sequence_to_tuple.hpp>
#define BOOST_VMD_DETAIL_SEQUENCE_ENUM_PROCESS(tuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(tuple), \
BOOST_VMD_EMPTY, \
BOOST_PP_TUPLE_ENUM \
) \
(tuple) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ENUM(...) \
BOOST_VMD_DETAIL_SEQUENCE_ENUM_PROCESS \
( \
BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE(__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_ENUM_D(d,...) \
BOOST_VMD_DETAIL_SEQUENCE_ENUM_PROCESS \
( \
BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_D(d,__VA_ARGS__) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_ENUM_HPP */

View File

@@ -0,0 +1,21 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_SIZE_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_SIZE_HPP
#include <boost/preprocessor/array/size.hpp>
#include <boost/vmd/detail/sequence_to_array.hpp>
#define BOOST_VMD_DETAIL_SEQUENCE_SIZE(vseq) \
BOOST_PP_ARRAY_SIZE(BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY(vseq)) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_SIZE_D(d,vseq) \
BOOST_PP_ARRAY_SIZE(BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_D(d,vseq)) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_SIZE_HPP */

View File

@@ -0,0 +1,47 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/sequence_elem.hpp>
#define BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY(...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
, \
BOOST_VMD_TYPE_ARRAY, \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
), \
(0,()) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_D(d,...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
, \
BOOST_VMD_TYPE_ARRAY, \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
), \
(0,()) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_TO_ARRAY_HPP */

View File

@@ -0,0 +1,47 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_HPP
#include <boost/preprocessor/control/iif.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/sequence_elem.hpp>
#define BOOST_VMD_DETAIL_SEQUENCE_TO_LIST(...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
, \
BOOST_VMD_TYPE_LIST, \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
), \
BOOST_PP_NIL \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_D(d,...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
, \
BOOST_VMD_TYPE_LIST, \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
), \
BOOST_PP_NIL \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_TO_LIST_HPP */

View File

@@ -0,0 +1,45 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_HPP
#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/sequence_elem.hpp>
#define BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ(...) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
, \
BOOST_VMD_TYPE_SEQ, \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_D(d,...) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
, \
BOOST_VMD_TYPE_SEQ, \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_TO_SEQ_HPP */

View File

@@ -0,0 +1,45 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_HPP
#include <boost/preprocessor/control/expr_iif.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/not_empty.hpp>
#include <boost/vmd/detail/sequence_elem.hpp>
#define BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE(...) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
, \
BOOST_VMD_TYPE_TUPLE, \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_D(d,...) \
BOOST_PP_EXPR_IIF \
( \
BOOST_VMD_DETAIL_NOT_EMPTY(BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__)), \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_PROCESS_TUPLE_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_GET_VSEQ(__VA_ARGS__), \
, \
BOOST_VMD_TYPE_TUPLE, \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_RETURN,__VA_ARGS__) \
) \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_TO_TUPLE_HPP */

View File

@@ -0,0 +1,274 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP)
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/detail/equal_type.hpp>
#include <boost/vmd/detail/is_array_common.hpp>
#include <boost/vmd/detail/is_list.hpp>
#include <boost/vmd/detail/modifiers.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/sequence_elem.hpp>
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY(dtuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(BOOST_PP_TUPLE_ELEM(1,dtuple)), \
BOOST_VMD_TYPE_ARRAY, \
BOOST_VMD_TYPE_TUPLE \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D(d,dtuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,BOOST_PP_TUPLE_ELEM(1,dtuple)), \
BOOST_VMD_TYPE_ARRAY, \
BOOST_VMD_TYPE_TUPLE \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST(dtuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_LIST(BOOST_PP_TUPLE_ELEM(1,dtuple)), \
BOOST_VMD_TYPE_LIST, \
BOOST_VMD_TYPE_TUPLE \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D(d,dtuple) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_IS_LIST_D(d,BOOST_PP_TUPLE_ELEM(1,dtuple)), \
BOOST_VMD_TYPE_LIST, \
BOOST_VMD_TYPE_TUPLE \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH(dtuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE \
( \
BOOST_VMD_TYPE_TUPLE, \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST(dtuple) \
), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY, \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST) \
) \
(dtuple) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH_D(d,dtuple) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D \
( \
d, \
BOOST_VMD_TYPE_TUPLE, \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D(d,dtuple) \
), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D, \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST) \
) \
(d,dtuple) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS(dtuple,rtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY, \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_LIST), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST, \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE), \
BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH \
) \
) \
) \
) \
(dtuple) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS_D(d,dtuple,rtype) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D, \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_LIST), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D, \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE), \
BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH_D \
) \
) \
) \
) \
(d,dtuple) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE(dtuple,...) \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS \
( \
dtuple, \
BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_ALL,__VA_ARGS__) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE_D(d,dtuple,...) \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS_D \
( \
d, \
dtuple, \
BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE \
( \
BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_ALL,__VA_ARGS__) \
) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY(dtuple,...) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE(BOOST_VMD_TYPE_TUPLE,BOOST_PP_TUPLE_ELEM(0,dtuple)), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE, \
BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)) \
) \
(dtuple,__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY_D(d,dtuple,...) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,BOOST_VMD_TYPE_TUPLE,BOOST_PP_TUPLE_ELEM(0,dtuple)), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE_D, \
BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)) \
) \
(d,dtuple,__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE(tuple,...) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY, \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_SEQUENCE) \
) \
(BOOST_PP_TUPLE_ELEM(0,tuple),__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE_D(d,tuple,...) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY_D, \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_SEQUENCE) \
) \
(d,BOOST_PP_TUPLE_ELEM(0,tuple),__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE(tuple,...) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_EMPTY), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE \
) \
(tuple,__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_D(d,tuple,...) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \
BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_EMPTY), \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE_D \
) \
(d,tuple,__VA_ARGS__) \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE(...) \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE \
( \
BOOST_VMD_DETAIL_SEQUENCE_ELEM \
( \
BOOST_VMD_ALLOW_ALL, \
0, \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
BOOST_VMD_RETURN_AFTER, \
BOOST_VMD_RETURN_TYPE_TUPLE \
), \
__VA_ARGS__ \
) \
/**/
#define BOOST_VMD_DETAIL_SEQUENCE_TYPE_D(d,...) \
BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_D \
( \
d, \
BOOST_VMD_DETAIL_SEQUENCE_ELEM_D \
( \
d, \
BOOST_VMD_ALLOW_ALL, \
0, \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
BOOST_VMD_RETURN_AFTER, \
BOOST_VMD_RETURN_TYPE_TUPLE \
), \
__VA_ARGS__ \
) \
/**/
#endif /* BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP */

View File

@@ -0,0 +1,41 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_SETUP_HPP)
#define BOOST_VMD_DETAIL_SETUP_HPP
#include <boost/preprocessor/config/config.hpp>
#if defined(BOOST_VMD_MSVC)
#undef BOOST_VMD_MSVC
#endif
#if defined(BOOST_VMD_MSVC_V8)
#undef BOOST_VMD_MSVC_V8
#endif
#if BOOST_PP_VARIADICS
#define BOOST_VMD_MSVC BOOST_PP_VARIADICS_MSVC
#if BOOST_VMD_MSVC && defined(_MSC_VER) && _MSC_VER == 1400
#define BOOST_VMD_MSVC_V8 1
#else
#define BOOST_VMD_MSVC_V8 0
#endif /* BOOST_VMD_MSVC && defined(_MSC_VER) && _MSC_VER == 1400 */
#if !defined(BOOST_VMD_ASSERT_DATA)
#if defined(NDEBUG)
#define BOOST_VMD_ASSERT_DATA 0
#else
#define BOOST_VMD_ASSERT_DATA 1
#endif /* NDEBUG */
#endif /* BOOST_VMD_ASSERT_DATA */
#else
#define BOOST_VMD_MSVC 0
#define BOOST_VMD_MSVC_V8 0
#if defined(BOOST_VMD_ASSERT_DATA)
#undef BOOST_VMD_ASSERT_DATA
#endif
#define BOOST_VMD_ASSERT_DATA 0
#endif /* BOOST_PP_VARIADICS */
#endif /* BOOST_VMD_DETAIL_SETUP_HPP */

View File

@@ -0,0 +1,196 @@
// (C) Copyright Edward Diener 2011-2015
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_VMD_DETAIL_TUPLE_HPP)
#define BOOST_VMD_DETAIL_TUPLE_HPP
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/punctuation/is_begin_parens.hpp>
#include <boost/preprocessor/tuple/size.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/vmd/empty.hpp>
#include <boost/vmd/is_empty.hpp>
#include <boost/vmd/identity.hpp>
#include <boost/vmd/detail/empty_result.hpp>
#include <boost/vmd/detail/mods.hpp>
#include <boost/vmd/detail/parens.hpp>
#define BOOST_VMD_DETAIL_TUPLE_BST_CS(vseq) \
BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_BEGIN_PARENS(vseq)),1) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_BST_CS_D(d,vseq) \
BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_BEGIN_PARENS(vseq)),1) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_BST(vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq), \
BOOST_VMD_DETAIL_TUPLE_BST_CS, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_BST_D(d,vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq), \
BOOST_VMD_DETAIL_TUPLE_BST_CS_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT(vseq) \
BOOST_VMD_DETAIL_TUPLE_BST(BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq)) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT_D(d,vseq) \
BOOST_VMD_DETAIL_TUPLE_BST_D(d,BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq)) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_TUPLE_BST(vseq), \
BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT, \
BOOST_VMD_IDENTITY(0) \
) \
(vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq) \
BOOST_VMD_IDENTITY_RESULT \
( \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_TUPLE_BST_D(d,vseq), \
BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT_D, \
BOOST_VMD_IDENTITY(0) \
) \
(d,vseq) \
) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ(vseq) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_SPLIT_PARENS \
) \
(vseq) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ_D(d,vseq) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq), \
BOOST_VMD_DETAIL_EMPTY_RESULT, \
BOOST_VMD_DETAIL_SPLIT_PARENS \
) \
(vseq) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_SPLIT(vseq) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq), \
BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ, \
BOOST_VMD_DETAIL_EMPTY_RESULT \
) \
(vseq) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_SPLIT_D(d,vseq) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq), \
BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ_D, \
BOOST_VMD_DETAIL_EMPTY_RESULT \
) \
(d,vseq) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ(vseq) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_BEGIN_PARENS \
) \
(vseq) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ_D(d,vseq) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq), \
BOOST_VMD_EMPTY, \
BOOST_VMD_DETAIL_BEGIN_PARENS \
) \
(vseq) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_PROCESS(vseq) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq), \
BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ, \
BOOST_VMD_EMPTY \
) \
(vseq) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_PROCESS_D(d,vseq) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BEGIN_PARENS(vseq), \
BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ_D, \
BOOST_VMD_EMPTY \
) \
(d,vseq) \
/**/
#define BOOST_VMD_DETAIL_TUPLE(...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_TUPLE_SPLIT, \
BOOST_VMD_DETAIL_TUPLE_PROCESS \
) \
(BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#define BOOST_VMD_DETAIL_TUPLE_D(d,...) \
BOOST_PP_IIF \
( \
BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
( \
BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
), \
BOOST_VMD_DETAIL_TUPLE_SPLIT_D, \
BOOST_VMD_DETAIL_TUPLE_PROCESS_D \
) \
(d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
/**/
#endif /* BOOST_VMD_DETAIL_TUPLE_HPP */

Some files were not shown because too many files have changed in this diff Show More