00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef SINDEX_ASSIGN_H
00012 #define SINDEX_ASSIGN_H
00013
00014
00015
00016
00017
00018
00019 #include "PETE/IpplExpressions.h"
00020
00021
00022 template<unsigned Dim> class SIndex;
00023
00024
00025 template<bool IsExpr> class SIExprTag { };
00026
00027
00029
00030
00031 template<unsigned Dim, class RHS, class OP, bool IsExpr>
00032 void
00033 assign(SIndex<Dim>&, RHS, OP, const NDIndex<Dim> &, SIExprTag<IsExpr>);
00034
00035
00037
00038
00039 #define SI_ASSIGNMENT_FUNCTIONS(FUNC,OP) \
00040 \
00041 template<unsigned Dim, class RHS> \
00042 inline void \
00043 FUNC(SIndex<Dim>& lhs, const PETE_Expr<RHS>& rhs) \
00044 { \
00045 assign(lhs, rhs.PETE_unwrap().MakeExpression(), OP(), \
00046 lhs.getFieldLayout().getDomain(), SIExprTag<false>()); \
00047 } \
00048 \
00049 template<unsigned Dim, class RHS> \
00050 inline void \
00051 FUNC(SIndex<Dim>& lhs, const PETE_Expr<RHS>& rhs, \
00052 const NDIndex<Dim>& domain) \
00053 { \
00054 assign(lhs, rhs.PETE_unwrap().MakeExpression(), OP(), \
00055 domain, SIExprTag<true>()); \
00056 }
00057
00058 #define SI_ASSIGNMENT_OPERATORS(FUNC,OP) \
00059 \
00060 template<unsigned Dim, class RHS> \
00061 inline void \
00062 FUNC(SIndex<Dim>& lhs, const PETE_Expr<RHS>& rhs) \
00063 { \
00064 assign(lhs, rhs.PETE_unwrap().MakeExpression(), OP(), \
00065 lhs.getFieldLayout().getDomain(), SIExprTag<false>()); \
00066 }
00067
00068
00069
00070
00071
00072 SI_ASSIGNMENT_FUNCTIONS(assign,OpAssign)
00073 SI_ASSIGNMENT_OPERATORS(operator<<,OpAssign)
00074 SI_ASSIGNMENT_OPERATORS(operator|=,OpBitwiseOrAssign)
00075 SI_ASSIGNMENT_OPERATORS(operator&=,OpBitwiseAndAssign)
00076
00077 #include "Index/SIndexAssign.cpp"
00078
00079 #endif // SINDEX_ASSIGN_H
00080
00081
00082
00083
00084
00085