📄 valarray_meta.h
字号:
// The template and inlines for the -*- C++ -*- internal _Meta class.// Copyright (C) 1997-1999 Cygnus Solutions//// This file is part of the GNU ISO C++ Library. This library is free// software; you can redistribute it and/or modify it under the// terms of the GNU General Public License as published by the// Free Software Foundation; either version 2, or (at your option)// any later version.// This library is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License along// with this library; see the file COPYING. If not, write to the Free// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,// USA.// As a special exception, you may use this file as part of a free software// library without restriction. Specifically, if other files instantiate// templates or use macros or inline functions from this file, or you compile// this file and link it with other files to produce an executable, this// file does not by itself cause the resulting executable to be covered by// the GNU General Public License. This exception does not however// invalidate any other reasons why the executable file might be covered by// the GNU General Public License.// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>#ifndef _CPP_VALARRAY_META_H#define _CPP_VALARRAY_META_H 1namespace std { // // Implementing a loosened valarray return value is tricky. // First we need to meet 26.3.1/3: we should not add more than // two levels of template nesting. Therefore we resort to template // template to "flatten" loosened return value types. // At some point we use partial specialization to remove one level // template nesting due to _Expr<> // // This class is NOT defined. It doesn't need to. template<typename _Tp1, typename _Tp2> class _Constant; // // Unary function application closure. // template<class _Dom> class _UnFunBase { public: typedef typename _Dom::value_type value_type; typedef value_type _Vt; _UnFunBase (const _Dom& __e, _Vt __f(_Vt)) : _M_expr(__e), _M_func(__f) {} _Vt operator[] (size_t __i) const { return _M_func(_M_expr[__i]); } size_t size () const { return _M_expr.size(); } private: const _Dom& _M_expr; _Vt (*_M_func)(_Vt); }; template<template<class, class> class _Meta, class _Dom> class _UnFunClos; template<class _Dom> struct _UnFunClos<_Expr,_Dom> : _UnFunBase<_Dom> { typedef _UnFunBase<_Dom> _Base; typedef typename _Base::value_type value_type; _UnFunClos (const _Dom& __e, value_type __f(value_type)) : _Base (__e, __f) {} }; template<typename _Tp> struct _UnFunClos<_ValArray,_Tp> : _UnFunBase<valarray<_Tp> > { typedef _UnFunBase<valarray<_Tp> > _Base; typedef typename _Base::value_type value_type; _UnFunClos (const valarray<_Tp>& __v, _Tp __f(_Tp)) : _Base (__v, __f) {} }; // // Binary function application closure. // template<template<class, class> class _Meta1, template<class, class> class Meta2, class _Dom1, class _Dom2> class _BinFunClos; template<class _Dom1, class _Dom2> class _BinFunBase { public: typedef typename _Dom1::value_type value_type; typedef value_type _Vt; _BinFunBase (const _Dom1& __e1, const _Dom2& __e2, _Vt __f (_Vt, _Vt)) : _M_expr1 (__e1), _M_expr2 (__e2), _M_func (__f) {} value_type operator[] (size_t __i) const { return _M_func (_M_expr1[__i], _M_expr2[__i]); } size_t size () const { return _M_expr1.size (); } private: const _Dom1& _M_expr1; const _Dom2& _M_expr2; _Vt (*_M_func)(_Vt, _Vt); }; template<class _Dom> class _BinFunBase1 { public: typedef typename _Dom::value_type value_type ; typedef value_type _Vt; _BinFunBase1 (const _Vt& __c, const _Dom& __e, _Vt __f(_Vt, _Vt)) : _M_expr1 (__c), _M_expr2 (__e), _M_func (__f) {} value_type operator[] (size_t __i) const { return _M_func (_M_expr1, _M_expr2[__i]); } size_t size () const { return _M_expr2.size (); } private: const _Vt& _M_expr1; const _Dom& _M_expr2; _Vt (*_M_func)(_Vt, _Vt); }; template<class _Dom> class _BinFunBase2 { public: typedef typename _Dom::value_type value_type; typedef value_type _Vt; _BinFunBase2 (const _Dom& __e, const _Vt& __c, _Vt __f(_Vt, _Vt)) : _M_expr1 (__e), _M_expr2 (__c), _M_func (__f) {} value_type operator[] (size_t __i) const { return _M_func (_M_expr1[__i], _M_expr2); } size_t size () const { return _M_expr1.size (); } private: const _Dom& _M_expr1; const _Vt& _M_expr2; _Vt (*_M_func)(_Vt, _Vt); }; template<class _Dom1, class _Dom2> struct _BinFunClos<_Expr,_Expr,_Dom1,_Dom2> : _BinFunBase<_Dom1,_Dom2> { typedef _BinFunBase<_Dom1,_Dom2> _Base; typedef typename _Base::value_type value_type; typedef value_type _Tp; _BinFunClos (const _Dom1& __e1, const _Dom2& __e2, _Tp __f(_Tp, _Tp)) : _Base (__e1, __e2, __f) {} }; template<typename _Tp> struct _BinFunClos<_ValArray,_ValArray,_Tp,_Tp> : _BinFunBase<valarray<_Tp>, valarray<_Tp> > { typedef _BinFunBase<valarray<_Tp>, valarray<_Tp> > _Base; typedef _Tp value_type; _BinFunClos (const valarray<_Tp>& __v, const valarray<_Tp>& __w, _Tp __f(_Tp, _Tp)) : _Base (__v, __w, __f) {} }; template<class _Dom> struct _BinFunClos<_Expr,_ValArray,_Dom,typename _Dom::value_type> : _BinFunBase<_Dom,valarray<typename _Dom::value_type> > { typedef typename _Dom::value_type _Tp; typedef _BinFunBase<_Dom,valarray<_Tp> > _Base; typedef _Tp value_type; _BinFunClos (const _Dom& __e, const valarray<_Tp>& __v, _Tp __f(_Tp, _Tp)) : _Base (__e, __v, __f) {} }; template<class _Dom> struct _BinFunClos<_ValArray,_Expr,typename _Dom::value_type,_Dom> : _BinFunBase<valarray<typename _Dom::value_type>,_Dom> { typedef typename _Dom::value_type _Tp; typedef _BinFunBase<_Dom,valarray<_Tp> > _Base; typedef _Tp value_type; _BinFunClos (const valarray<_Tp>& __v, const _Dom& __e, _Tp __f(_Tp, _Tp)) : _Base (__v, __e, __f) {} }; template<class _Dom> struct _BinFunClos<_Expr,_Constant,_Dom,typename _Dom::value_type> : _BinFunBase2<_Dom> { typedef typename _Dom::value_type _Tp; typedef _Tp value_type; typedef _BinFunBase2<_Dom> _Base; _BinFunClos (const _Dom& __e, const _Tp& __t, _Tp __f (_Tp, _Tp)) : _Base (__e, __t, __f) {} }; template<class _Dom> struct _BinFunClos<_Constant,_Expr,_Dom,typename _Dom::value_type> : _BinFunBase1<_Dom> { typedef typename _Dom::value_type _Tp; typedef _Tp value_type; typedef _BinFunBase1<_Dom> _Base; _BinFunClos (const _Tp& __t, const _Dom& __e, _Tp __f (_Tp, _Tp)) : _Base (__t, __e, __f) {} }; template<typename _Tp> struct _BinFunClos<_ValArray,_Constant,_Tp,_Tp> : _BinFunBase2<valarray<_Tp> > { typedef _BinFunBase2<valarray<_Tp> > _Base; typedef _Tp value_type; _BinFunClos (const valarray<_Tp>& __v, const _Tp& __t, _Tp __f(_Tp, _Tp)) : _Base (__v, __t, __f) {} }; template<typename _Tp> struct _BinFunClos<_Constant,_ValArray,_Tp,_Tp> : _BinFunBase1<valarray<_Tp> > { typedef _BinFunBase1<valarray<_Tp> > _Base; typedef _Tp value_type; _BinFunClos (const _Tp& __t, const valarray<_Tp>& __v, _Tp __f (_Tp, _Tp)) : _Base (__t, __v, __f) {} }; // // Apply function taking a value/const reference closure // template<typename _Dom, typename _Arg> class _FunBase { public: typedef typename _Dom::value_type value_type; _FunBase (const _Dom& __e, value_type __f(_Arg)) : _M_expr (__e), _M_func (__f) {} value_type operator[] (size_t __i) const { return _M_func (_M_expr[__i]); } size_t size() const { return _M_expr.size ();} private: const _Dom& _M_expr; value_type (*_M_func)(_Arg); }; template<class _Dom> struct _ValFunClos<_Expr,_Dom> : _FunBase<_Dom, typename _Dom::value_type> { typedef _FunBase<_Dom, typename _Dom::value_type> _Base; typedef typename _Base::value_type value_type; typedef value_type _Tp; _ValFunClos (const _Dom& __e, _Tp __f (_Tp)) : _Base (__e, __f) {} }; template<typename _Tp> struct _ValFunClos<_ValArray,_Tp> : _FunBase<valarray<_Tp>, _Tp> { typedef _FunBase<valarray<_Tp>, _Tp> _Base; typedef _Tp value_type; _ValFunClos (const valarray<_Tp>& __v, _Tp __f(_Tp)) : _Base (__v, __f) {} }; template<class _Dom> struct _RefFunClos<_Expr,_Dom> : _FunBase<_Dom, const typename _Dom::value_type&> { typedef _FunBase<_Dom, const typename _Dom::value_type&> _Base; typedef typename _Base::value_type value_type; typedef value_type _Tp; _RefFunClos (const _Dom& __e, _Tp __f (const _Tp&)) : _Base (__e, __f) {} }; template<typename _Tp> struct _RefFunClos<_ValArray,_Tp> : _FunBase<valarray<_Tp>, const _Tp&> { typedef _FunBase<valarray<_Tp>, const _Tp&> _Base; typedef _Tp value_type; _RefFunClos (const valarray<_Tp>& __v, _Tp __f(const _Tp&)) : _Base (__e, __f) {} }; // // Unary expression closure. // template<template<class> class _Oper, typename _Arg> class _UnBase { public: typedef _Oper<typename _Arg::value_type> _Op; typedef typename _Op::result_type value_type; _UnBase (const _Arg& __e) : _M_expr(__e) {} value_type operator[] (size_t) const; size_t size () const { return _M_expr.size (); } private: const _Arg& _M_expr; }; template<template<class> class _Oper, typename _Arg> inline typename _UnBase<_Oper, _Arg>::value_type _UnBase<_Oper, _Arg>::operator[] (size_t __i) const { return _Op() (_M_expr[__i]); } template<template<class> class _Oper, class _Dom> struct _UnClos<_Oper, _Expr, _Dom> : _UnBase<_Oper, _Dom> { typedef _Dom _Arg; typedef _UnBase<_Oper, _Dom> _Base; typedef typename _Base::value_type value_type; _UnClos (const _Arg& __e) : _Base(__e) {} }; template<template<class> class _Oper, typename _Tp> struct _UnClos<_Oper, _ValArray, _Tp> : _UnBase<_Oper, valarray<_Tp> > { typedef valarray<_Tp> _Arg; typedef _UnBase<_Oper, valarray<_Tp> > _Base; typedef typename _Base::result_type value_type; _UnClos (const _Arg& __e) : _Base(__e) {} }; // // Binary expression closure. // template<template<class> class _Oper, typename _FirstArg, typename _SecondArg> class _BinBase { public: typedef _Oper<typename _FirstArg::value_type> _Op;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -