OLD | NEW |
(Empty) | |
| 1 #ifndef TEST_VECTOR_OPS_H |
| 2 #define TEST_VECTOR_OPS_H |
| 3 |
| 4 #include "vectors.h" |
| 5 |
| 6 // The VectorOps<> class acts like Vectors<> but also has insertelement, |
| 7 // Subzero_insertelement, extractelement, and Subzero_extractelement |
| 8 // fields. |
| 9 |
| 10 template <typename T> struct VectorOps; |
| 11 #define FIELD(TYNAME, FIELDNAME) VectorOps<TYNAME>::FIELDNAME |
| 12 #define TY(TYNAME) FIELD(TYNAME, Ty) |
| 13 #define CASTTY(TYNAME) FIELD(TYNAME, CastTy) |
| 14 #define DECLARE_VECTOR_OPS(NAME) \ |
| 15 template <> struct VectorOps<NAME> : public Vectors<NAME> { \ |
| 16 static Ty (*insertelement)(Ty, CastTy, int32_t); \ |
| 17 static CastTy (*extractelement)(Ty, int32_t); \ |
| 18 static Ty (*Subzero_insertelement)(Ty, CastTy, int32_t); \ |
| 19 static CastTy (*Subzero_extractelement)(Ty, int32_t); \ |
| 20 }; \ |
| 21 extern "C" { \ |
| 22 TY(NAME) insertelement_##NAME(TY(NAME), CASTTY(NAME), int32_t); \ |
| 23 TY(NAME) Subzero_insertelement_##NAME(TY(NAME), CASTTY(NAME), int32_t); \ |
| 24 CASTTY(NAME) extractelement_##NAME(TY(NAME), int32_t); \ |
| 25 CASTTY(NAME) Subzero_extractelement_##NAME(TY(NAME), int32_t); \ |
| 26 } \ |
| 27 TY(NAME) (*FIELD(NAME, insertelement))(TY(NAME), CASTTY(NAME), int32_t) = \ |
| 28 &insertelement_##NAME; \ |
| 29 TY(NAME) (*FIELD(NAME, Subzero_insertelement))( \ |
| 30 TY(NAME), CASTTY(NAME), int32_t) = &Subzero_insertelement_##NAME; \ |
| 31 CASTTY(NAME) (*FIELD(NAME, extractelement))(TY(NAME), int32_t) = \ |
| 32 &extractelement_##NAME; \ |
| 33 CASTTY(NAME) (*FIELD(NAME, Subzero_extractelement))(TY(NAME), int32_t) = \ |
| 34 &Subzero_extractelement_##NAME; |
| 35 |
| 36 #define X(ty, eltty, castty) DECLARE_VECTOR_OPS(ty) |
| 37 VECTOR_TYPE_TABLE |
| 38 #undef X |
| 39 |
| 40 #define X(ty, eltty, numelements) DECLARE_VECTOR_OPS(ty) |
| 41 I1_VECTOR_TYPE_TABLE |
| 42 #undef X |
| 43 |
| 44 #endif |
OLD | NEW |