| // Part of the Crubit project, under the Apache License v2.0 with LLVM | |
| // Exceptions. See /LICENSE for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| #ifndef CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_OPERATORS_OPERATORS_H_ | |
| #define CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_OPERATORS_OPERATORS_H_ | |
| #include <cstdint> | |
| #pragma clang lifetime_elision | |
| struct TestStruct1 final { | |
| int i; | |
| }; | |
| struct TestStruct2 final { | |
| // Comparison with the same struct. Should generate: | |
| // impl PartialEq for TestStruct2. // `PartialEq<TestStruct2>` also ok. | |
| inline bool operator==(const TestStruct2& other) const { | |
| return (i % 10) == (other.i % 10); | |
| } | |
| // Comparison with another struct. Should generate: | |
| // impl PartialEq<TestStruct1> for TestStruct2. | |
| inline bool operator==(const TestStruct1& other) const { | |
| return (i % 10) == (other.i % 10); | |
| } | |
| // Comparison with the same struct. Should generate: | |
| // impl PartialOrd for TestStruct2 | |
| // `PartialOrd<TestStruct2>` also ok. | |
| inline bool operator<(const TestStruct2& other) const { | |
| return (i % 10) < (other.i % 10); | |
| } | |
| // Comparison with another struct. Shouldn't generate anything since the | |
| // operands are not of the same type. | |
| inline bool operator<(const TestStruct1& other) const { | |
| return (i % 10) < (other.i % 10); | |
| } | |
| // Test that method names starting with "operator" are not confused with real | |
| // operator names (e.g. accidentally treating "operator1" as an unrecognized / | |
| // unsupported operator). | |
| inline int operator1() const { return i; } | |
| int i; | |
| }; | |
| ////////////////////////////////////////////////////////////////////// | |
| struct OperandForOutOfLineDefinition final { | |
| // Non-`inline` definition. Should generate: | |
| // impl PartialEq for TestStructForOutOfLineDefinition | |
| bool operator==(const OperandForOutOfLineDefinition& other) const; | |
| // Non-`inline` definition. Should generate: | |
| // impl PartialOrd for TestStructForOutOfLineDefinition | |
| bool operator<(const OperandForOutOfLineDefinition& other) const; | |
| int i; | |
| }; | |
| ////////////////////////////////////////////////////////////////////// | |
| struct OperandForFreeFunc final { | |
| int i; | |
| }; | |
| // Non-member function. Should generate: | |
| // impl PartialEq for TestStructForFreeFunc. | |
| bool operator==(const OperandForFreeFunc& lhs, const OperandForFreeFunc& rhs); | |
| // Non-member function. Should generate: | |
| // impl PartialOrd for TestStructForFreeFunc. | |
| bool operator<(const OperandForFreeFunc& lhs, const OperandForFreeFunc& rhs); | |
| ////////////////////////////////////////////////////////////////////// | |
| struct OperandByRef final { | |
| int i; | |
| }; | |
| // Non-member function. Should generate: | |
| // impl PartialEq for OperandByRef. | |
| bool operator==(const OperandByRef& lhs, const OperandByRef& rhs); | |
| // Non-member function. Should generate: | |
| // impl PartialOrd for OperandByRef. | |
| bool operator<(const OperandByRef& lhs, const OperandByRef& rhs); | |
| ////////////////////////////////////////////////////////////////////// | |
| struct OperandByValue final { | |
| int i; | |
| }; | |
| // Non-member function. Should generate: | |
| // impl PartialEq for OperandByValue. | |
| bool operator==(OperandByValue lhs, OperandByValue rhs); | |
| // Non-member function. Should generate: | |
| // impl PartialOrd for OperandByValue. | |
| bool operator<(OperandByValue lhs, OperandByValue rhs); | |
| ////////////////////////////////////////////////////////////////////// | |
| struct OperandByRefAndValue final { | |
| int i; | |
| }; | |
| // Non-member function. Should generate: | |
| // impl PartialEq for OperandByRefAndValue. | |
| bool operator==(const OperandByRefAndValue& lhs, OperandByRefAndValue rhs); | |
| // Non-member function. Should generate: | |
| // impl PartialOrd for OperandByRefAndValue. | |
| bool operator<(const OperandByRefAndValue& lhs, OperandByRefAndValue rhs); | |
| ////////////////////////////////////////////////////////////////////// | |
| struct OperandByValueAndRef final { | |
| int i; | |
| }; | |
| // Non-member function. Should generate: | |
| // impl PartialEq for OperandByValueAndRef. | |
| bool operator==(OperandByValueAndRef lhs, const OperandByValueAndRef& rhs); | |
| // Non-member function. Should generate: | |
| // impl PartialOrd for OperandByValueAndRef. | |
| bool operator<(OperandByValueAndRef lhs, const OperandByValueAndRef& rhs); | |
| ////////////////////////////////////////////////////////////////////// | |
| struct OperandForFreeFuncInDifferentNamespace final { | |
| int i; | |
| }; | |
| namespace test_namespace_bindings { | |
| // This should *not* generate PartialEq, because we are trying to mimic ADL. | |
| // TODO(b/200066396): We currently generate PartialEq here, but it doesn't | |
| // compile. | |
| // bool operator==(const OperandForFreeFuncInDifferentNamespace& lhs, | |
| // const OperandForFreeFuncInDifferentNamespace& rhs); | |
| } // namespace test_namespace_bindings | |
| ////////////////////////////////////////////////////////////////////// | |
| struct ManyOperators final { | |
| ManyOperators operator+() const { return ManyOperators{+i}; } | |
| ManyOperators operator-() const { return ManyOperators{-i}; } | |
| ManyOperators operator!() const { return ManyOperators{!i}; } | |
| ManyOperators operator~() const { return ManyOperators{~i}; } | |
| ManyOperators operator+(const ManyOperators rhs) const { | |
| return ManyOperators{i + rhs.i}; | |
| } | |
| ManyOperators operator-(const ManyOperators rhs) const { | |
| return ManyOperators{i - rhs.i}; | |
| } | |
| ManyOperators operator*(const ManyOperators rhs) const { | |
| return ManyOperators{i * rhs.i}; | |
| } | |
| ManyOperators operator/(const ManyOperators rhs) const { | |
| return ManyOperators{i / rhs.i}; | |
| } | |
| ManyOperators operator%(const ManyOperators rhs) const { | |
| return ManyOperators{i % rhs.i}; | |
| } | |
| ManyOperators operator&(const ManyOperators rhs) const { | |
| return ManyOperators{i & rhs.i}; | |
| } | |
| ManyOperators operator|(const ManyOperators rhs) const { | |
| return ManyOperators{i | rhs.i}; | |
| } | |
| ManyOperators operator^(const ManyOperators rhs) const { | |
| return ManyOperators{i ^ rhs.i}; | |
| } | |
| ManyOperators operator<<(const ManyOperators rhs) const { | |
| return ManyOperators{i << rhs.i}; | |
| } | |
| ManyOperators operator>>(const ManyOperators rhs) const { | |
| return ManyOperators{i >> rhs.i}; | |
| } | |
| ManyOperators& operator+=(const ManyOperators rhs) { | |
| i += rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator-=(const ManyOperators rhs) { | |
| i -= rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator*=(const ManyOperators rhs) { | |
| i *= rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator/=(const ManyOperators rhs) { | |
| i /= rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator%=(const ManyOperators rhs) { | |
| i %= rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator&=(const ManyOperators rhs) { | |
| i &= rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator|=(const ManyOperators rhs) { | |
| i |= rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator^=(const ManyOperators rhs) { | |
| i ^= rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator<<=(const ManyOperators rhs) { | |
| i <<= rhs.i; | |
| return *this; | |
| } | |
| ManyOperators& operator>>=(const ManyOperators rhs) { | |
| i >>= rhs.i; | |
| return *this; | |
| } | |
| int i; | |
| }; | |
| #endif // CRUBIT_RS_BINDINGS_FROM_CC_TEST_STRUCT_OPERATORS_OPERATORS_H_ |