Home | History | Annotate | Download | only in support
      1  // A lightweight class, with pointer-like methods, that contains an int
      2 struct X
      3 {
      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 
     16 struct XWithImplicitIntStarConversion
     17 {
     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 
     31 struct XWithImplicitConstIntStarConversion
     32 {
     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 
     46 struct ExplicitX
     47 {
     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 
     60 struct MoveConstructibleFromX
     61 {
     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 
     75 struct ExplicitMoveConstructibleFromX
     76 {
     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 
     90 struct CopyConstructibleFromX
     91 {
     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 
    105 struct ExplicitCopyConstructibleFromX
    106 {
    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 
    120