diff options
Diffstat (limited to 'boost/vmd/elem.hpp')
-rw-r--r-- | boost/vmd/elem.hpp | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/boost/vmd/elem.hpp b/boost/vmd/elem.hpp new file mode 100644 index 0000000000..f6d575e22f --- /dev/null +++ b/boost/vmd/elem.hpp @@ -0,0 +1,292 @@ + +// (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_ELEM_HPP) +#define BOOST_VMD_ELEM_HPP + +#include <boost/vmd/detail/setup.hpp> + +#if BOOST_PP_VARIADICS + +#include <boost/vmd/detail/modifiers.hpp> +#include <boost/vmd/detail/sequence_elem.hpp> + +/* + + The succeeding comments in this file are in doxygen format. + +*/ + +/** \file +*/ + +/** \def BOOST_VMD_ELEM(elem,...) + + \brief Accesses an element of a sequence. + + elem = A sequence element number. From 0 to sequence size - 1. + ... = Variadic parameters. + + The first variadic parameter is required and is the sequence to access. + Further variadic parameters are all optional. + + With no further variadic parameters the macro returns the particular element + in the sequence. If the element number is outside the bounds of the sequence + macro access fails and the macro turns emptiness. + + Optional parameters determine what it means that an element is successfully + accessed as well as what data is returned by the macro. + + Filters: specifying a VMD type tells the macro to return the element only + if it is of the VMD type specified, else macro access fails. If more than + one VMD type is specified as an optional parameter the last one + specified is the filter. + + Matching Identifiers: If the filter is specified as the identifier type, BOOST_VMD_TYPE_IDENTIFIER, + optional parameters which are identifiers specify that the element accessed + must match one of the identifiers else access fails. The identifiers may be specified multiple + times as single optional parameters or once as a tuple of identifier + parameters. If the identifiers are specified as single optional parameters + they cannot be any of the specific BOOST_VMD_ optional parameters in order to be + recognized as matching identifiers. Normally this should never be the case. + The only situation where this could occur is if the VMD types, which are filters, + are used as matching identifiers; in this case the matching identifiers need + to be passed as a tuple of identifier parameters so they are not treated + as filters. + + Filters and matching identifiers change what it means that an element is successfully + accessed. They do not change what data is returned by the macro. The remaining optional + parameters do not change what it means that an element is successfully accessed but they + do change what data is returned by the macro. + + Splitting: Splitting allows the macro to return the rest of the sequence + after the element accessed. + + If BOOST_VMD_RETURN_AFTER is specified the return is a tuple + with the element accessed as the first tuple parameter and the rest of + the sequence as the second tuple parameter. If element access fails + both tuple parameters are empty. + + If BOOST_VMD_RETURN_ONLY_AFTER + is specified the return is the rest of the sequence after the element accessed + found. If the element access fails the return is emptiness. + + If BOOST_VMD_RETURN_NO_AFTER, the default, is specified no splitting + occurs. + + If more than one of the splitting identifiers are specified + the last one specified determines the splitting. + + Return Type: The element accessed can be changed to return both the type + of the element as well as the element data with optional return type + parameters. When a type is returned, the element accessed which is returned becomes a + two-element tuple where the type of the element accessed is the first tuple element and the element + data itself is the second tuple element. If the macro fails to access the + element the element access returned is emptiness and not a tuple. + + If BOOST_VMD_RETURN_NO_TYPE, the default, is specified no type is returned + as part of the element accessed. + + If BOOST_VMD_RETURN_TYPE is specified the specific type of the element + is returned in the tuple. + + If BOOST_VMD_RETURN_TYPE_ARRAY is specified + an array type is returned if the element is an array, else a tuple + type is returned if the element is a tuple, else the actual type + is returned for non-tuple data. + + If BOOST_VMD_RETURN_TYPE_LIST is specified + a list type is returned if the element is a list, else a tuple + type is returned if the element is a tuple, else the actual type + is returned for non-tuple data. + + If BOOST_VMD_RETURN_TYPE_TUPLE is specified + a tuple type is returned for all tuple-like data, else the actual type + is returned for non-tuple data. + + If more than one return type optional + parameter is specified the last one specified determines the return type. + + If a filter is specified optional return type parameters are ignored and + the default BOOST_VMD_RETURN_NO_TYPE is in effect. + + Index: If the filter is specified as the identifier type, BOOST_VMD_TYPE_IDENTIFIER, + and matching identifiers are specified, an index parameter specifies that the + numeric index, starting with 0, of the matching identifier found, be returned + as part of the result. + + If BOOST_VMD_RETURN_INDEX is specified an index is returned + as part of the result. + + If BOOST_VMD_RETURN_NO_INDEX, the default, is specified + no index is returned as part of the result. + + If both are specified the last one specified determines the index parameter. + + When an index is returned as part of the result, the result is a tuple where the + element accessed is the first tuple parameter and the index is the last tuple parameter. + If element access fails the index is empty. If there is no BOOST_VMD_TYPE_IDENTIFIER + filter or if there are no matching identifiers the BOOST_VMD_RETURN_INDEX is ignored + and no index is returned as part of the result. + + returns = With no optional parameters the element accessed is returned, or emptiness if + element is outside the bounds of the sequence. Filters and matching identifiers + can change the meaning of whether the element accessed is returned or failure + occurs, but whenever failure occurs emptiness is returned as the element access part + of that failure, else the element accessed is returned. Return type optional parameters, + when filters are not used, return the element accessed as a two-element tuple + where the first tuple element is the type and the second tuple element is the + data; if the element is not accessed then emptiness is returned as the element access + and not a tuple. Splitting with BOOST_VMD_RETURN_AFTER returns a tuple where the element accessed + is the first tuple element and the rest of the sequence is the second tuple element. + Splitting with BOOST_VMD_RETURN_ONLY_AFTER returns the rest of the sequence after + the element accessed or emptiness if the element can not be accessed. Indexing + returns the index as part of the output only if filtering with + BOOST_VMD_TYPE_IDENTIFIER is specified and matching identifiers are specified. + When the index is returned with BOOST_VMD_RETURN_AFTER it is the third element + of the tuple returned, else it is the second element of a tuple where the element + accessed is the first element of the tuple. + +*/ + +#define BOOST_VMD_ELEM(elem,...) \ + BOOST_VMD_DETAIL_SEQUENCE_ELEM(BOOST_VMD_ALLOW_ALL,elem,__VA_ARGS__) \ +/**/ + +/** \def BOOST_VMD_ELEM_D(d,elem,...) + + \brief Accesses an element of a sequence. Re-entrant version. + + d = The next available BOOST_PP_WHILE iteration. + elem = A sequence element number. From 0 to sequence size - 1. + ... = Variadic parameters. + + The first variadic parameter is required and is the sequence to access. + Further variadic parameters are all optional. + + With no further variadic parameters the macro returns the particular element + in the sequence. If the element number is outside the bounds of the sequence + macro access fails and the macro turns emptiness. + + Optional parameters determine what it means that an element is successfully + accessed as well as what data is returned by the macro. + + Filters: specifying a VMD type tells the macro to return the element only + if it is of the VMD type specified, else macro access fails. If more than + one VMD type is specified as an optional parameter the last one + specified is the filter. + + Matching Identifiers: If the filter is specified as the identifier type, BOOST_VMD_TYPE_IDENTIFIER, + optional parameters which are identifiers specify that the element accessed + must match one of the identifiers else access fails. The identifiers may be specified multiple + times as single optional parameters or once as a tuple of identifier + parameters. If the identifiers are specified as single optional parameters + they cannot be any of the specific BOOST_VMD_ optional parameters in order to be + recognized as matching identifiers. Normally this should never be the case. + The only situation where this could occur is if the VMD types, which are filters, + are used as matching identifiers; in this case the matching identifiers need + to be passed as a tuple of identifier parameters so they are not treated + as filters. + + Filters and matching identifiers change what it means that an element is successfully + accessed. They do not change what data is returned by the macro. The remaining optional + parameters do not change what it means that an element is successfully accessed but they + do change what data is returned by the macro. + + Splitting: Splitting allows the macro to return the rest of the sequence + after the element accessed. + + If BOOST_VMD_RETURN_AFTER is specified the return is a tuple + with the element accessed as the first tuple parameter and the rest of + the sequence as the second tuple parameter. If element access fails + both tuple parameters are empty. + + If BOOST_VMD_RETURN_ONLY_AFTER + is specified the return is the rest of the sequence after the element accessed + found. If the element access fails the return is emptiness. + + If BOOST_VMD_RETURN_NO_AFTER, the default, is specified no splitting + occurs. + + If more than one of the splitting identifiers are specified + the last one specified determines the splitting. + + Return Type: The element accessed can be changed to return both the type + of the element as well as the element data with optional return type + parameters. When a type is returned, the element accessed which is returned becomes a + two-element tuple where the type of the element accessed is the first tuple element and the element + data itself is the second tuple element. If the macro fails to access the + element the element access returned is emptiness and not a tuple. + + If BOOST_VMD_RETURN_NO_TYPE, the default, is specified no type is returned + as part of the element accessed. + + If BOOST_VMD_RETURN_TYPE is specified the specific type of the element + is returned in the tuple. + + If BOOST_VMD_RETURN_TYPE_ARRAY is specified + an array type is returned if the element is an array, else a tuple + type is returned if the element is a tuple, else the actual type + is returned for non-tuple data. + + If BOOST_VMD_RETURN_TYPE_LIST is specified + a list type is returned if the element is a list, else a tuple + type is returned if the element is a tuple, else the actual type + is returned for non-tuple data. + + If BOOST_VMD_RETURN_TYPE_TUPLE is specified + a tuple type is returned for all tuple-like data, else the actual type + is returned for non-tuple data. If more than one return type optional + parameter is specified the last one specified determines the return type. + + If a filter is specified optional return type parameters are ignored and + the default BOOST_VMD_RETURN_NO_TYPE is in effect. + + Index: If the filter is specified as the identifier type, BOOST_VMD_TYPE_IDENTIFIER, + and matching identifiers are specified, an index parameter specifies that the + numeric index, starting with 0, of the matching identifier found, be returned + as part of the result. + + If BOOST_VMD_RETURN_INDEX is specified an index is returned + as part of the result. + + If BOOST_VMD_RETURN_NO_INDEX, the default, is specified + no index is returned as part of the result. + + If both are specified the last one specified determines the index parameter. + + When an index is returned as part of the result, the result is a tuple where the + element accessed is the first tuple parameter and the index is the last tuple parameter. + If element access fails the index is empty. If there is no BOOST_VMD_TYPE_IDENTIFIER + filter or if there are no matching identifiers the BOOST_VMD_RETURN_INDEX is ignored + and no index is returned as part of the result. + + returns = With no optional parameters the element accessed is returned, or emptiness if + element is outside the bounds of the sequence. Filters and matching identifiers + can change the meaning of whether the element accessed is returned or failure + occurs, but whenever failure occurs emptiness is returned as the element access part + of that failure, else the element accessed is returned. Return type optional parameters, + when filters are not used, return the element accessed as a two-element tuple + where the first tuple element is the type and the second tuple element is the + data; if the element is not accessed then emptiness is returned as the element access + and not a tuple. Splitting with BOOST_VMD_RETURN_AFTER returns a tuple where the element accessed + is the first tuple element and the rest of the sequence is the second tuple element. + Splitting with BOOST_VMD_RETURN_ONLY_AFTER returns the rest of the sequence after + the element accessed or emptiness if the element can not be accessed. Indexing + returns the index as part of the output only if filtering with + BOOST_VMD_TYPE_IDENTIFIER is specified and matching identifiers are specified. + When the index is returned with BOOST_VMD_RETURN_AFTER it is the third element + of the tuple returned, else it is the second element of a tuple where the element + accessed is the first element of the tuple. + +*/ + +#define BOOST_VMD_ELEM_D(d,elem,...) \ + BOOST_VMD_DETAIL_SEQUENCE_ELEM_D(d,BOOST_VMD_ALLOW_ALL,elem,__VA_ARGS__) \ +/**/ + +#endif /* BOOST_PP_VARIADICS */ +#endif /* BOOST_VMD_ELEM_HPP */ |