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

📄 tinyvec.h

📁 A C++ class library for scientific computing
💻 H
字号:
// -*- C++ -*-/*************************************************************************** * blitz/tinyvec.h      Declaration of the TinyVector<T, N> class * * $Id: tinyvec.h,v 1.9 2005/10/06 23:23:40 julianc Exp $ * * Copyright (C) 1997-2001 Todd Veldhuizen <tveldhui@oonumerics.org> * * This program 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 * of the License, or (at your option) any later version. * * This program 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. * * Suggestions:          blitz-dev@oonumerics.org * Bugs:                 blitz-bugs@oonumerics.org * * For more information, please see the Blitz++ Home Page: *    http://oonumerics.org/blitz/ * ***************************************************************************/#ifndef BZ_TINYVEC_H#define BZ_TINYVEC_H#include <blitz/blitz.h>#include <blitz/range.h>#include <blitz/listinit.h>#include <blitz/tiny.h>BZ_NAMESPACE(blitz)/***************************************************************************** * Forward declarations */template<typename P_numtype, int N_length, int N_stride BZ_TEMPLATE_DEFAULT(1) >class TinyVectorIter;template<typename P_numtype, int N_length, int N_stride BZ_TEMPLATE_DEFAULT(1) >class TinyVectorIterConst;template<typename P_numtype>class Vector;template<typename P_expr>class _bz_VecExpr;template<typename P_distribution>class Random;template<typename P_numtype>class VectorPick;template<typename T_numtype1, typename T_numtype2, int N_rows, int N_columns,    int N_vecStride>class _bz_matrixVectorProduct;/***************************************************************************** * Declaration of class TinyVector */template<typename P_numtype, int N_length>class TinyVector {public:    //////////////////////////////////////////////    // Public Types    //////////////////////////////////////////////    typedef P_numtype                                    T_numtype;    typedef TinyVector<T_numtype,N_length>               T_vector;    typedef TinyVectorIter<T_numtype,N_length,1>         T_iterator;    typedef TinyVectorIterConst<T_numtype,N_length,1>    T_constIterator;    typedef T_numtype*                                   iterator;    typedef const T_numtype*                             const_iterator;    enum { numElements = N_length };    TinyVector()  { }    ~TinyVector() { }    inline TinyVector(const TinyVector<T_numtype,N_length>& x);    template <typename T_numtype2>    inline TinyVector(const TinyVector<T_numtype2,N_length>& x);    inline TinyVector(const T_numtype initValue);    inline TinyVector(const T_numtype x[]) {        memcpy(data_,x,N_length*sizeof(T_numtype));    }    TinyVector(T_numtype x0, T_numtype x1)    {        data_[0] = x0;        data_[1] = x1;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2,        T_numtype x3)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;        data_[3] = x3;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2,        T_numtype x3, T_numtype x4)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;        data_[3] = x3;        data_[4] = x4;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2,        T_numtype x3, T_numtype x4, T_numtype x5)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;        data_[3] = x3;        data_[4] = x4;        data_[5] = x5;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2,        T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;        data_[3] = x3;        data_[4] = x4;        data_[5] = x5;        data_[6] = x6;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2,        T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6,        T_numtype x7)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;        data_[3] = x3;        data_[4] = x4;        data_[5] = x5;        data_[6] = x6;        data_[7] = x7;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2,        T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6,        T_numtype x7, T_numtype x8)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;        data_[3] = x3;        data_[4] = x4;        data_[5] = x5;        data_[6] = x6;        data_[7] = x7;        data_[8] = x8;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2,        T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6,        T_numtype x7, T_numtype x8, T_numtype x9)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;        data_[3] = x3;        data_[4] = x4;        data_[5] = x5;        data_[6] = x6;        data_[7] = x7;        data_[8] = x8;        data_[9] = x9;    }    TinyVector(T_numtype x0, T_numtype x1, T_numtype x2,        T_numtype x3, T_numtype x4, T_numtype x5, T_numtype x6,        T_numtype x7, T_numtype x8, T_numtype x9, T_numtype x10)    {        data_[0] = x0;        data_[1] = x1;        data_[2] = x2;        data_[3] = x3;        data_[4] = x4;        data_[5] = x5;        data_[6] = x6;        data_[7] = x7;        data_[8] = x8;        data_[9] = x9;        data_[10] = x10;    }    // Constructor added by Peter Nordlund    template<typename P_expr>    inline TinyVector(_bz_VecExpr<P_expr> expr);    T_iterator      beginFast()       { return T_iterator(*this);      }    T_constIterator beginFast() const { return T_constIterator(*this); }    iterator       begin()       { return data_; }    const_iterator begin() const { return data_; }    iterator       end()       { return data_ + N_length; }    const_iterator end() const { return data_ + N_length; }    T_numtype * restrict data()    { return data_; }    const T_numtype * restrict data() const    { return data_; }    T_numtype * restrict dataFirst()    { return data_; }    const T_numtype * restrict dataFirst() const    { return data_; }    unsigned length() const    { return N_length; }    /////////////////////////////////////////////    // Library-internal member functions    // These are undocumented and may change or    // disappear in future releases.    /////////////////////////////////////////////    unsigned _bz_suggestLength() const    { return N_length; }    bool _bz_hasFastAccess() const    { return true; }    T_numtype& restrict _bz_fastAccess(unsigned i)    { return data_[i]; }    T_numtype _bz_fastAccess(unsigned i) const    { return data_[i]; }    template<typename P_expr, typename P_updater>    void _bz_assign(P_expr, P_updater);    _bz_VecExpr<T_constIterator> _bz_asVecExpr() const    { return _bz_VecExpr<T_constIterator>(beginFast()); }       //////////////////////////////////////////////    // Subscripting operators    //////////////////////////////////////////////    bool lengthCheck(unsigned i) const    {        BZPRECHECK(i < N_length,             "TinyVector<" << BZ_DEBUG_TEMPLATE_AS_STRING_LITERAL(T_numtype)             << "," << N_length << "> index out of bounds: " << i);        return true;    }    const T_numtype& operator()(unsigned i) const    {        BZPRECONDITION(lengthCheck(i));        return data_[i];    }    T_numtype& restrict operator()(unsigned i)    {         BZPRECONDITION(lengthCheck(i));        return data_[i];    }    const T_numtype& operator[](unsigned i) const    {        BZPRECONDITION(lengthCheck(i));        return data_[i];    }    T_numtype& restrict operator[](unsigned i)    {        BZPRECONDITION(lengthCheck(i));        return data_[i];    }    //////////////////////////////////////////////    // Assignment operators    //////////////////////////////////////////////    // Scalar operand    ListInitializationSwitch<T_vector,T_numtype*> operator=(T_numtype x)    {        return ListInitializationSwitch<T_vector,T_numtype*>(*this, x);    }    T_vector& initialize(const T_numtype);    T_vector& operator+=(const T_numtype);    T_vector& operator-=(const T_numtype);    T_vector& operator*=(const T_numtype);    T_vector& operator/=(const T_numtype);    T_vector& operator%=(const T_numtype);    T_vector& operator^=(const T_numtype);    T_vector& operator&=(const T_numtype);    T_vector& operator|=(const T_numtype);    T_vector& operator>>=(const int);    T_vector& operator<<=(const int);    template<typename P_numtype2>     T_vector& operator=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator+=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator-=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator*=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator/=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator%=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator^=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator&=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator|=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator>>=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2>    T_vector& operator<<=(const TinyVector<P_numtype2, N_length> &);    template<typename P_numtype2> T_vector& operator=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator+=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator-=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator*=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator/=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator%=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator^=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator&=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator|=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator>>=(const Vector<P_numtype2> &);    template<typename P_numtype2> T_vector& operator<<=(const Vector<P_numtype2> &);    // Vector expression operand    template<typename P_expr> T_vector& operator=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator+=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator-=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator*=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator/=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator%=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator^=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator&=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator|=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator>>=(_bz_VecExpr<P_expr>);    template<typename P_expr> T_vector& operator<<=(_bz_VecExpr<P_expr>);    // VectorPick operand    template<typename P_numtype2>    T_vector& operator=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator+=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator-=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator*=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator/=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator%=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator^=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator&=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator|=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator>>=(const VectorPick<P_numtype2> &);    template<typename P_numtype2>    T_vector& operator<<=(const VectorPick<P_numtype2> &);    // Range operand    T_vector& operator=(const Range&);    T_vector& operator+=(const Range&);    T_vector& operator-=(const Range&);    T_vector& operator*=(const Range&);    T_vector& operator/=(const Range&);    T_vector& operator%=(const Range&);    T_vector& operator^=(const Range&);    T_vector& operator&=(const Range&);    T_vector& operator|=(const Range&);    T_vector& operator>>=(const Range&);    T_vector& operator<<=(const Range&);    T_numtype* restrict getInitializationIterator()    { return dataFirst(); }private:    T_numtype data_[N_length];};// Specialization for N = 0: KCC is giving some// peculiar errors, perhaps this will fix.template<typename T>class TinyVector<T,0> {};BZ_NAMESPACE_END#include <blitz/tinyveciter.h>  // Iterators#include <blitz/tvecglobs.h>    // Global functions#include <blitz/vector.h>       // Expression templates#include <blitz/tinyvec.cc>     // Member functions#include <blitz/tinyvecio.cc>   // I/O functions#endif // BZ_TINYVEC_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -