| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 | 
//  (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. <br/>    ...       = 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.               @code      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.      @endcode      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. <br/>    elem      = A sequence element number. From 0 to sequence size - 1. <br/>    ...       = 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.               @code      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.      @endcode      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 */
 |