summaryrefslogtreecommitdiff
path: root/test/support/propagate_const_helpers.h
diff options
context:
space:
mode:
Diffstat (limited to 'test/support/propagate_const_helpers.h')
-rw-r--r--test/support/propagate_const_helpers.h119
1 files changed, 119 insertions, 0 deletions
diff --git a/test/support/propagate_const_helpers.h b/test/support/propagate_const_helpers.h
new file mode 100644
index 0000000000000..581565a342708
--- /dev/null
+++ b/test/support/propagate_const_helpers.h
@@ -0,0 +1,119 @@
+ // A lightweight class, with pointer-like methods, that contains an int
+struct X
+{
+ int i_;
+
+ constexpr const int &operator*() const { return i_; }
+ constexpr int &operator*() { return i_; }
+ constexpr const int *get() const { return &i_; }
+ constexpr int *get() { return &i_; }
+ constexpr const int *operator->() const { return &i_; }
+ constexpr int *operator->() { return &i_; }
+
+ constexpr X(int i) : i_(i) {}
+};
+
+struct XWithImplicitIntStarConversion
+{
+ int i_;
+
+ constexpr const int &operator*() const { return i_; }
+ constexpr int &operator*() { return i_; }
+ constexpr const int *get() const { return &i_; }
+ constexpr int *get() { return &i_; }
+ constexpr const int *operator->() const { return &i_; }
+ constexpr int *operator->() { return &i_; }
+ constexpr operator int* () { return &i_; }
+
+ constexpr XWithImplicitIntStarConversion(int i) : i_(i) {}
+};
+
+struct XWithImplicitConstIntStarConversion
+{
+ int i_;
+
+ constexpr const int &operator*() const { return i_; }
+ constexpr int &operator*() { return i_; }
+ constexpr const int *get() const { return &i_; }
+ constexpr int *get() { return &i_; }
+ constexpr const int *operator->() const { return &i_; }
+ constexpr int *operator->() { return &i_; }
+ constexpr operator const int* () const { return &i_; }
+
+ constexpr XWithImplicitConstIntStarConversion(int i) : i_(i) {}
+};
+
+struct ExplicitX
+{
+ int i_;
+
+ constexpr const int &operator*() const { return i_; }
+ constexpr int &operator*() { return i_; }
+ constexpr const int *get() const { return &i_; }
+ constexpr int *get() { return &i_; }
+ constexpr const int *operator->() const { return &i_; }
+ constexpr int *operator->() { return &i_; }
+
+ constexpr explicit ExplicitX(int i) : i_(i) {}
+};
+
+struct MoveConstructibleFromX
+{
+ int i_;
+
+ constexpr const int &operator*() const { return i_; }
+ constexpr int &operator*() { return i_; }
+ constexpr const int *get() const { return &i_; }
+ constexpr int *get() { return &i_; }
+ constexpr const int *operator->() const { return &i_; }
+ constexpr int *operator->() { return &i_; }
+
+ constexpr MoveConstructibleFromX(int i) : i_(i) {}
+ constexpr MoveConstructibleFromX(X&& x) : i_(x.i_) {}
+};
+
+struct ExplicitMoveConstructibleFromX
+{
+ int i_;
+
+ constexpr const int &operator*() const { return i_; }
+ constexpr int &operator*() { return i_; }
+ constexpr const int *get() const { return &i_; }
+ constexpr int *get() { return &i_; }
+ constexpr const int *operator->() const { return &i_; }
+ constexpr int *operator->() { return &i_; }
+
+ constexpr ExplicitMoveConstructibleFromX(int i) : i_(i) {}
+ constexpr explicit ExplicitMoveConstructibleFromX(X&& x) : i_(x.i_) {}
+};
+
+struct CopyConstructibleFromX
+{
+ int i_;
+
+ constexpr const int &operator*() const { return i_; }
+ constexpr int &operator*() { return i_; }
+ constexpr const int *get() const { return &i_; }
+ constexpr int *get() { return &i_; }
+ constexpr const int *operator->() const { return &i_; }
+ constexpr int *operator->() { return &i_; }
+
+ constexpr CopyConstructibleFromX(int i) : i_(i) {}
+ constexpr CopyConstructibleFromX(const X& x) : i_(x.i_) {}
+};
+
+struct ExplicitCopyConstructibleFromX
+{
+ int i_;
+
+ constexpr const int &operator*() const { return i_; }
+ constexpr int &operator*() { return i_; }
+ constexpr const int *get() const { return &i_; }
+ constexpr int *get() { return &i_; }
+ constexpr const int *operator->() const { return &i_; }
+ constexpr int *operator->() { return &i_; }
+
+ constexpr ExplicitCopyConstructibleFromX(int i) : i_(i) {}
+ constexpr explicit ExplicitCopyConstructibleFromX(const X& x) : i_(x.i_) {}
+};
+