xref: /llvm-project/libcxx/test/support/propagate_const_helpers.h (revision 689ce810598bec7b35dd7ebe33ce5c5cce1453c7)
1*945cacc8SJonathan Coe  // A lightweight class, with pointer-like methods, that contains an int
2*945cacc8SJonathan Coe struct X
3*945cacc8SJonathan Coe {
4*945cacc8SJonathan Coe     int i_;
5*945cacc8SJonathan Coe 
6*945cacc8SJonathan Coe     constexpr const int &operator*() const { return i_; }
7*945cacc8SJonathan Coe     constexpr int &operator*() { return i_; }
getX8*945cacc8SJonathan Coe     constexpr const int *get() const { return &i_; }
getX9*945cacc8SJonathan Coe     constexpr int *get() { return &i_; }
10*945cacc8SJonathan Coe     constexpr const int *operator->() const { return &i_; }
11*945cacc8SJonathan Coe     constexpr int *operator->() { return &i_; }
12*945cacc8SJonathan Coe 
XX13*945cacc8SJonathan Coe     constexpr X(int i) : i_(i) {}
14*945cacc8SJonathan Coe };
15*945cacc8SJonathan Coe 
16*945cacc8SJonathan Coe struct XWithImplicitIntStarConversion
17*945cacc8SJonathan Coe {
18*945cacc8SJonathan Coe     int i_;
19*945cacc8SJonathan Coe 
20*945cacc8SJonathan Coe     constexpr const int &operator*() const { return i_; }
21*945cacc8SJonathan Coe     constexpr int &operator*() { return i_; }
getXWithImplicitIntStarConversion22*945cacc8SJonathan Coe     constexpr const int *get() const { return &i_; }
getXWithImplicitIntStarConversion23*945cacc8SJonathan Coe     constexpr int *get() { return &i_; }
24*945cacc8SJonathan Coe     constexpr const int *operator->() const { return &i_; }
25*945cacc8SJonathan Coe     constexpr int *operator->() { return &i_; }
26*945cacc8SJonathan Coe     constexpr operator int* () { return &i_; }
27*945cacc8SJonathan Coe 
XWithImplicitIntStarConversionXWithImplicitIntStarConversion28*945cacc8SJonathan Coe     constexpr XWithImplicitIntStarConversion(int i) : i_(i) {}
29*945cacc8SJonathan Coe };
30*945cacc8SJonathan Coe 
31*945cacc8SJonathan Coe struct XWithImplicitConstIntStarConversion
32*945cacc8SJonathan Coe {
33*945cacc8SJonathan Coe     int i_;
34*945cacc8SJonathan Coe 
35*945cacc8SJonathan Coe     constexpr const int &operator*() const { return i_; }
36*945cacc8SJonathan Coe     constexpr int &operator*() { return i_; }
getXWithImplicitConstIntStarConversion37*945cacc8SJonathan Coe     constexpr const int *get() const { return &i_; }
getXWithImplicitConstIntStarConversion38*945cacc8SJonathan Coe     constexpr int *get() { return &i_; }
39*945cacc8SJonathan Coe     constexpr const int *operator->() const { return &i_; }
40*945cacc8SJonathan Coe     constexpr int *operator->() { return &i_; }
41*945cacc8SJonathan Coe     constexpr operator const int* () const { return &i_; }
42*945cacc8SJonathan Coe 
XWithImplicitConstIntStarConversionXWithImplicitConstIntStarConversion43*945cacc8SJonathan Coe     constexpr XWithImplicitConstIntStarConversion(int i) : i_(i) {}
44*945cacc8SJonathan Coe };
45*945cacc8SJonathan Coe 
46*945cacc8SJonathan Coe struct ExplicitX
47*945cacc8SJonathan Coe {
48*945cacc8SJonathan Coe     int i_;
49*945cacc8SJonathan Coe 
50*945cacc8SJonathan Coe     constexpr const int &operator*() const { return i_; }
51*945cacc8SJonathan Coe     constexpr int &operator*() { return i_; }
getExplicitX52*945cacc8SJonathan Coe     constexpr const int *get() const { return &i_; }
getExplicitX53*945cacc8SJonathan Coe     constexpr int *get() { return &i_; }
54*945cacc8SJonathan Coe     constexpr const int *operator->() const { return &i_; }
55*945cacc8SJonathan Coe     constexpr int *operator->() { return &i_; }
56*945cacc8SJonathan Coe 
ExplicitXExplicitX57*945cacc8SJonathan Coe     constexpr explicit ExplicitX(int i) : i_(i) {}
58*945cacc8SJonathan Coe };
59*945cacc8SJonathan Coe 
60*945cacc8SJonathan Coe struct MoveConstructibleFromX
61*945cacc8SJonathan Coe {
62*945cacc8SJonathan Coe     int i_;
63*945cacc8SJonathan Coe 
64*945cacc8SJonathan Coe     constexpr const int &operator*() const { return i_; }
65*945cacc8SJonathan Coe     constexpr int &operator*() { return i_; }
getMoveConstructibleFromX66*945cacc8SJonathan Coe     constexpr const int *get() const { return &i_; }
getMoveConstructibleFromX67*945cacc8SJonathan Coe     constexpr int *get() { return &i_; }
68*945cacc8SJonathan Coe     constexpr const int *operator->() const { return &i_; }
69*945cacc8SJonathan Coe     constexpr int *operator->() { return &i_; }
70*945cacc8SJonathan Coe 
MoveConstructibleFromXMoveConstructibleFromX71*945cacc8SJonathan Coe     constexpr MoveConstructibleFromX(int i) : i_(i) {}
MoveConstructibleFromXMoveConstructibleFromX72*945cacc8SJonathan Coe     constexpr MoveConstructibleFromX(X&& x) : i_(x.i_) {}
73*945cacc8SJonathan Coe };
74*945cacc8SJonathan Coe 
75*945cacc8SJonathan Coe struct ExplicitMoveConstructibleFromX
76*945cacc8SJonathan Coe {
77*945cacc8SJonathan Coe     int i_;
78*945cacc8SJonathan Coe 
79*945cacc8SJonathan Coe     constexpr const int &operator*() const { return i_; }
80*945cacc8SJonathan Coe     constexpr int &operator*() { return i_; }
getExplicitMoveConstructibleFromX81*945cacc8SJonathan Coe     constexpr const int *get() const { return &i_; }
getExplicitMoveConstructibleFromX82*945cacc8SJonathan Coe     constexpr int *get() { return &i_; }
83*945cacc8SJonathan Coe     constexpr const int *operator->() const { return &i_; }
84*945cacc8SJonathan Coe     constexpr int *operator->() { return &i_; }
85*945cacc8SJonathan Coe 
ExplicitMoveConstructibleFromXExplicitMoveConstructibleFromX86*945cacc8SJonathan Coe     constexpr ExplicitMoveConstructibleFromX(int i) : i_(i) {}
ExplicitMoveConstructibleFromXExplicitMoveConstructibleFromX87*945cacc8SJonathan Coe     constexpr explicit ExplicitMoveConstructibleFromX(X&& x) : i_(x.i_) {}
88*945cacc8SJonathan Coe };
89*945cacc8SJonathan Coe 
90*945cacc8SJonathan Coe struct CopyConstructibleFromX
91*945cacc8SJonathan Coe {
92*945cacc8SJonathan Coe     int i_;
93*945cacc8SJonathan Coe 
94*945cacc8SJonathan Coe     constexpr const int &operator*() const { return i_; }
95*945cacc8SJonathan Coe     constexpr int &operator*() { return i_; }
getCopyConstructibleFromX96*945cacc8SJonathan Coe     constexpr const int *get() const { return &i_; }
getCopyConstructibleFromX97*945cacc8SJonathan Coe     constexpr int *get() { return &i_; }
98*945cacc8SJonathan Coe     constexpr const int *operator->() const { return &i_; }
99*945cacc8SJonathan Coe     constexpr int *operator->() { return &i_; }
100*945cacc8SJonathan Coe 
CopyConstructibleFromXCopyConstructibleFromX101*945cacc8SJonathan Coe     constexpr CopyConstructibleFromX(int i) : i_(i) {}
CopyConstructibleFromXCopyConstructibleFromX102*945cacc8SJonathan Coe     constexpr CopyConstructibleFromX(const X& x) : i_(x.i_) {}
103*945cacc8SJonathan Coe };
104*945cacc8SJonathan Coe 
105*945cacc8SJonathan Coe struct ExplicitCopyConstructibleFromX
106*945cacc8SJonathan Coe {
107*945cacc8SJonathan Coe     int i_;
108*945cacc8SJonathan Coe 
109*945cacc8SJonathan Coe     constexpr const int &operator*() const { return i_; }
110*945cacc8SJonathan Coe     constexpr int &operator*() { return i_; }
getExplicitCopyConstructibleFromX111*945cacc8SJonathan Coe     constexpr const int *get() const { return &i_; }
getExplicitCopyConstructibleFromX112*945cacc8SJonathan Coe     constexpr int *get() { return &i_; }
113*945cacc8SJonathan Coe     constexpr const int *operator->() const { return &i_; }
114*945cacc8SJonathan Coe     constexpr int *operator->() { return &i_; }
115*945cacc8SJonathan Coe 
ExplicitCopyConstructibleFromXExplicitCopyConstructibleFromX116*945cacc8SJonathan Coe     constexpr ExplicitCopyConstructibleFromX(int i) : i_(i) {}
ExplicitCopyConstructibleFromXExplicitCopyConstructibleFromX117*945cacc8SJonathan Coe     constexpr explicit ExplicitCopyConstructibleFromX(const X& x) : i_(x.i_) {}
118*945cacc8SJonathan Coe };
119