16 #include "../detail/setup.hpp"    18 #ifndef GLM_ENABLE_EXPERIMENTAL    19 #   error "GLM: GLM_GTX_range is an experimental extension and may change in the future. Use #define GLM_ENABLE_EXPERIMENTAL before including it, if you really want to use it."    22 #if !GLM_HAS_RANGE_FOR    23 #   error "GLM_GTX_range requires C++11 suppport or 'range for'"    26 #include "../gtc/type_ptr.hpp"    27 #include "../gtc/vec1.hpp"    34 #   if GLM_COMPILER & GLM_COMPILER_VC    35 #       pragma warning(push)    36 #       pragma warning(disable : 4100) // unreferenced formal parameter    39     template<
typename T, qualifier Q>
    40     inline length_t components(vec<1, T, Q> 
const& v)
    45     template<
typename T, qualifier Q>
    46     inline length_t components(vec<2, T, Q> 
const& v)
    51     template<
typename T, qualifier Q>
    52     inline length_t components(vec<3, T, Q> 
const& v)
    57     template<
typename T, qualifier Q>
    58     inline length_t components(vec<4, T, Q> 
const& v)
    63     template<
typename genType>
    64     inline length_t components(genType 
const& m)
    66         return m.length() * m[0].length();
    69     template<
typename genType>
    70     inline typename genType::value_type 
const * begin(genType 
const& v)
    75     template<
typename genType>
    76     inline typename genType::value_type 
const * end(genType 
const& v)
    78         return begin(v) + components(v);
    81     template<
typename genType>
    82     inline typename genType::value_type * begin(genType& v)
    87     template<
typename genType>
    88     inline typename genType::value_type * end(genType& v)
    90         return begin(v) + components(v);
    93 #   if GLM_COMPILER & GLM_COMPILER_VC GLM_FUNC_DECL genType::value_type const  * value_ptr(genType const &v)
Return the constant address to the data of the input parameter.