im com
This commit is contained in:
parent
718a5f22cf
commit
437193432a
1 changed files with 66 additions and 22 deletions
|
@ -50,36 +50,80 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <class... Indices>
|
|
||||||
class XHighLevelOpBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
virtual DynamicO<OpH<OperationRoot<double,typename Indices::RangeType>>>
|
class HighLevelOpBase
|
||||||
create(const std::shared_ptr<Indices>&... inds) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
class HighLevelOp
|
|
||||||
{
|
{
|
||||||
private:
|
protected:
|
||||||
std::shared_ptr<OpHolderBase> mOp;
|
std::shared_ptr<HighLevelOpBase> mPrev
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
typedef OperationRoot<double,CR,CR> OpCC;
|
||||||
|
typedef OperationRoot<double,CR,DR> OpCD;
|
||||||
|
typedef OperationRoot<double,DR> OpD;
|
||||||
|
|
||||||
};
|
virtual bool root() const = 0;
|
||||||
|
|
||||||
|
virtual DynamicO<OpH<OpRR>>
|
||||||
|
create(const std::shared_ptr<CI> ind1,
|
||||||
|
const std::shared_ptr<CI> ind2) = 0;
|
||||||
|
|
||||||
template <class Op, class... Indices>
|
virtual OperationRoot<double,DR> get1() = 0;
|
||||||
class XHighLevelOp : public XHighLevelOpBase
|
virtual OperationRoot<double,CR,DR> get2() = 0;
|
||||||
{
|
|
||||||
private:
|
void appendPrev(const std::shared_ptr<HighLevelOpBase>& in)
|
||||||
Op mOp;
|
|
||||||
public:
|
|
||||||
virtual DynamicO<OpH<OperationRoot<double,typename Indices::RangeType>>>
|
|
||||||
create(const std::shared_ptr<Indices>&... inds) override final
|
|
||||||
{
|
{
|
||||||
return mkDynOutOp(mOp, inds...);
|
if(mPrev){
|
||||||
|
mPrev->appendPrev(in)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mPrev = in;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class HighLevelOpRoot : public HighLevelOpBase
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class OpF>
|
||||||
|
class HighLevelOp2 : public HighLevelOpBase
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::shared_ptr<HighLevelOpBase> mIn1;
|
||||||
|
std::shared_ptr<HighLevelOpBase> mIn2;
|
||||||
|
|
||||||
|
public:
|
||||||
|
typedef HighLevelOpBase B;
|
||||||
|
typedef Operation<double,OpF,B::OpCC,B::OpCC> OxCCxCC;
|
||||||
|
typedef Operation<double,OpF,B::OpCD,B::OpCD> OxCDxCD;
|
||||||
|
|
||||||
|
virtual bool root() const override final
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual DynamicO<OpH<OperationRoot<double,CR,CR>>>
|
||||||
|
create(const std::shared_ptr<CI> ind1,
|
||||||
|
const std::shared_ptr<CI> ind2) override final
|
||||||
|
{
|
||||||
|
if(not mIn1->root()){
|
||||||
|
DynamicO<OpH<OperationRoot<double,CR,CR>>> dop1 = mIn1->create(ind1,ind2);
|
||||||
|
op1 = *dop1.data()->mOp;
|
||||||
|
if(not mIn2->root()){
|
||||||
|
DynamicO<OpH<OperationRoot<double,CR,CR>>> dop2 = mIn2->create(ind1,ind2);
|
||||||
|
op2 = *dop2.data()->mOp;
|
||||||
|
return mkDynOutOp(OxRRRR(op1,op2), ind1, ind2);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
OperationRoot<double,DR,CR>& op2 = mIn2->get2(ind1,ind2);
|
||||||
|
return mkDynOutOp(OxRRRR(op1,op2), ind1, ind2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return DynamicO<OpH<OperationRoot<double,CR,CR>>>();
|
||||||
}
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue