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

📄 arroperands.h

📁 A C++ class library for scientific computing
💻 H
字号:
#include <iostream>#include <string>#include <fstream>class operand {public:    operand(const char* name, const char* templateName, const char* iterator,         const char* numtype, const char* initialization)      : name_(name), template_(templateName), iterator_(iterator),         numtype_(numtype), initialization_(initialization)    { }    virtual int haveTemplate() const    { return template_ != 0; }    void setOperandNum(int i)     { operandNum_ = i; }    virtual void printName(std::ostream& os)    {         os << name_;                   printTemplateList(os);    }    virtual void printTemplate(std::ostream& os, int n=0)    {        if (haveTemplate())            os << template_ << operandNum_;    }    virtual void printTemplateType(std::ostream& os, int n=0)    {        if (haveTemplate())            os << "class";    }    virtual int numTemplateParameters() const    {        if (haveTemplate())            return 1;        else            return 0;    }    virtual int isScalar() const    { return 0; }    virtual int isInteger() const    { return 0; }    virtual int isComplex() const    { return 0; }    virtual int isRange() const    { return 0; }    virtual int passByReference() const    { return 0; }    virtual void printArgument(std::ostream& os)    {        if (passByReference())            os << "const ";        printName(os);        if (passByReference())            os << "&";        os << " d" << operandNum_;          }    virtual void printIterator(std::ostream& os)    {        os << iterator_;        printTemplateList(os);    }    virtual void printTemplateList(std::ostream& os)    {        if (haveTemplate())        {            os << "<";            for (int i=0; i < numTemplateParameters(); ++i)            {                // printTemplateType(os,i);                // os << " ";                printTemplate(os,i);                if (i != numTemplateParameters() - 1)                    os << ", ";            }            os << ">";        }    }    virtual void printNumtype(std::ostream& os)    {        os << numtype_ << operandNum_;    }    virtual void printInitialization(std::ostream& os)    {        os << "d" << operandNum_;               if (initialization_ != 0)            os << initialization_;    }protected:    const char* name_;    const char* template_;    const char* iterator_;    const char* numtype_;    const char* initialization_;    int operandNum_;};class ArrayOperand : public operand {public:    ArrayOperand()      : operand("Array", 0, "ArrayIterator", "T_numtype", ".begin()")    { }    virtual void printTemplate(std::ostream& os, int n)    {        switch(n)        {            case 0: os << "T_numtype" << operandNum_; break;            case 1: os << "N_rank" << operandNum_; break;        }    }    virtual int passByReference() const    { return 1; }    virtual void printTemplateType(std::ostream& os, int n=0)    {        switch(n)        {            case 0: os << "class"; break;            case 1: os << "int"; break;        }    }    virtual int numTemplateParameters() const    {        return 2;    }    virtual int haveTemplate() const    { return 1; }};class ArrayExprOperand : public operand {public:    ArrayExprOperand()      : operand("_bz_ArrayExpr", "P_expr", "_bz_ArrayExpr",           0, 0)    { }    virtual void printNumtype(std::ostream& os)    {        os << "typename P_expr" << operandNum_ << "::T_numtype";    }};class IndexOperand : public operand {public:    IndexOperand()      : operand("IndexPlaceholder", "N_index", "IndexPlaceholder", 0, 0)    { }    virtual void printNumtype(std::ostream& os)    {        os << "int";    }    virtual void printTemplateType(std::ostream& os, int n=0)    {        if (haveTemplate())            os << "int";    }};class ScalarOperand : public operand {public:    ScalarOperand(const char* name)      : operand(name, 0, 0, name, 0)    { }    virtual void printIterator(std::ostream& os)    {        os << "_bz_ArrayExprConstant<" << name_ << ">";    }    virtual void printInitialization(std::ostream& os)    {        os << "_bz_ArrayExprConstant<" << name_ << ">(d"           << operandNum_ << ")";    }    virtual void printNumtype(std::ostream& os)    {        os << name_;    }    virtual int isScalar() const    { return 1; }    virtual int isInteger() const    { return !strcmp(name_, "int"); }};class ComplexOperand : public operand {public:    ComplexOperand()      : operand("complex", "T", 0, "complex", 0)    { }    virtual int isComplex() const    { return 1; }    virtual void printIterator(std::ostream& os)    {        os << "_bz_ArrayExprConstant<";        printNumtype(os);        os << "> ";    }    virtual void printInitialization(std::ostream& os)    {        printIterator(os);        os << "(d" << operandNum_ << ")";    }    virtual void printNumtype(std::ostream& os)    {        os << "complex<";        printTemplate(os);        os << "> ";    }    virtual int isScalar() const    { return 1; }    virtual int isInteger() const    { return !strcmp(name_, "int"); }};/************************************************************************** * * Operand Set * **************************************************************************/#define BZ_ARREXPR_NUM_OPERANDS 8class operandSet {public:    operandSet()    {        operands_[0] = new ArrayOperand;        operands_[1] = new ArrayExprOperand;        operands_[2] = new IndexOperand;        operands_[3] = new ScalarOperand("int");        operands_[4] = new ScalarOperand("float");        operands_[5] = new ScalarOperand("double");        operands_[6] = new ScalarOperand("long double");        operands_[7] = new ComplexOperand;    }    ~operandSet()    {        for (int i=0; i < BZ_ARREXPR_NUM_OPERANDS; ++i)            delete operands_[i];    }    operand& operator[](int i)     { return *operands_[i]; }    int numOperands() const    { return BZ_ARREXPR_NUM_OPERANDS; }    void setOperandNum(int num)    {        for (int i=0; i < BZ_ARREXPR_NUM_OPERANDS; ++i)            operands_[i]->setOperandNum(num);    }private:    operandSet(const operandSet&);    void operator=(const operandSet&);    operand * operands_[BZ_ARREXPR_NUM_OPERANDS];};

⌨️ 快捷键说明

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