⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 valarray_meta.h

📁 c++编程宝典源码及Quincy99编译器 是《标准C++编程宝典》电子工业出版社的光盘
💻 H
📖 第 1 页 / 共 3 页
字号:
// 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 + -