brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.7 KiB · a9df1b9 Raw
119 lines · c
1 // A lightweight class, with pointer-like methods, that contains an int2struct X3{4    int i_;5 6    constexpr const int &operator*() const { return i_; }7    constexpr int &operator*() { return i_; }8    constexpr const int *get() const { return &i_; }9    constexpr int *get() { return &i_; }10    constexpr const int *operator->() const { return &i_; }11    constexpr int *operator->() { return &i_; }12 13    constexpr X(int i) : i_(i) {}14};15 16struct XWithImplicitIntStarConversion17{18    int i_;19 20    constexpr const int &operator*() const { return i_; }21    constexpr int &operator*() { return i_; }22    constexpr const int *get() const { return &i_; }23    constexpr int *get() { return &i_; }24    constexpr const int *operator->() const { return &i_; }25    constexpr int *operator->() { return &i_; }26    constexpr operator int* () { return &i_; }27 28    constexpr XWithImplicitIntStarConversion(int i) : i_(i) {}29};30 31struct XWithImplicitConstIntStarConversion32{33    int i_;34 35    constexpr const int &operator*() const { return i_; }36    constexpr int &operator*() { return i_; }37    constexpr const int *get() const { return &i_; }38    constexpr int *get() { return &i_; }39    constexpr const int *operator->() const { return &i_; }40    constexpr int *operator->() { return &i_; }41    constexpr operator const int* () const { return &i_; }42 43    constexpr XWithImplicitConstIntStarConversion(int i) : i_(i) {}44};45 46struct ExplicitX47{48    int i_;49 50    constexpr const int &operator*() const { return i_; }51    constexpr int &operator*() { return i_; }52    constexpr const int *get() const { return &i_; }53    constexpr int *get() { return &i_; }54    constexpr const int *operator->() const { return &i_; }55    constexpr int *operator->() { return &i_; }56 57    constexpr explicit ExplicitX(int i) : i_(i) {}58};59 60struct MoveConstructibleFromX61{62    int i_;63 64    constexpr const int &operator*() const { return i_; }65    constexpr int &operator*() { return i_; }66    constexpr const int *get() const { return &i_; }67    constexpr int *get() { return &i_; }68    constexpr const int *operator->() const { return &i_; }69    constexpr int *operator->() { return &i_; }70 71    constexpr MoveConstructibleFromX(int i) : i_(i) {}72    constexpr MoveConstructibleFromX(X&& x) : i_(x.i_) {}73};74 75struct ExplicitMoveConstructibleFromX76{77    int i_;78 79    constexpr const int &operator*() const { return i_; }80    constexpr int &operator*() { return i_; }81    constexpr const int *get() const { return &i_; }82    constexpr int *get() { return &i_; }83    constexpr const int *operator->() const { return &i_; }84    constexpr int *operator->() { return &i_; }85 86    constexpr ExplicitMoveConstructibleFromX(int i) : i_(i) {}87    constexpr explicit ExplicitMoveConstructibleFromX(X&& x) : i_(x.i_) {}88};89 90struct CopyConstructibleFromX91{92    int i_;93 94    constexpr const int &operator*() const { return i_; }95    constexpr int &operator*() { return i_; }96    constexpr const int *get() const { return &i_; }97    constexpr int *get() { return &i_; }98    constexpr const int *operator->() const { return &i_; }99    constexpr int *operator->() { return &i_; }100 101    constexpr CopyConstructibleFromX(int i) : i_(i) {}102    constexpr CopyConstructibleFromX(const X& x) : i_(x.i_) {}103};104 105struct ExplicitCopyConstructibleFromX106{107    int i_;108 109    constexpr const int &operator*() const { return i_; }110    constexpr int &operator*() { return i_; }111    constexpr const int *get() const { return &i_; }112    constexpr int *get() { return &i_; }113    constexpr const int *operator->() const { return &i_; }114    constexpr int *operator->() { return &i_; }115 116    constexpr ExplicitCopyConstructibleFromX(int i) : i_(i) {}117    constexpr explicit ExplicitCopyConstructibleFromX(const X& x) : i_(x.i_) {}118};119