/* A collection of all the different known operator prototypes in C++ */

// arithmetic operators
Type1  operator+(const Type1& a);                          // +a
Type1  operator+(const Type1& a, const Type2& b);          // a + b
Type1& operator++(Type1& a);                               // ++a
Type1  operator++(Type1& a, int);                          // a++
Type1& operator+=(Type1& a, const Type1& b);               // a += b
Type1  operator-(const Type1& a);                          // -a
Type1& operator--(Type1& a);                               // --a
Type1  operator--(Type1& a, int);                          // a--
Type1& operator-=(Type1& a, const Type1& b);               // a -= b
Type1  operator*(const Type1& a, const Type1& b);          // a * b
Type1& operator*=(Type1& a, const Type1& b);               // a *= b
Type1  operator/(const Type1& a, const Type1& b);          // a / b
Type1& operator/=(Type1& a, const Type1& b);               // a /= b
Type1  operator%(const Type1& a, const Type1& b);          // a % b
Type1& operator%=(Type1& a, const Type1& b);               // a %= b

// comparison operators
bool operator<(const Type1& a, const Type1& b);            // a < b
bool operator<=(const Type1& a, const Type1& b);           // a <= b
bool operator>(const Type1& a, const Type1& b);            // a > b
bool operator>=(const Type1& a, const Type1& b);           // a >= b
bool operator!=(const Type1& a, const Type1& b);           // a != b
bool operator==(const Type1& a, const Type1& b);           // a == b
bool operator<=>(const Type1& a, const Type1& b);          // a <=> b

// logical operators
bool operator!(const Type1& a);                            // !a
bool operator&&(const Type1& a, const Type1& b);           // a && b
bool operator||(const Type1& a, const Type1& b);           // a || b

// bitwise operators
Type1  operator<<(const Type1& a, const Type1& b);         // a << b
Type1& operator<<=(Type1& a, const Type1& b);              // a <<= b
Type1  operator>>(const Type1& a, const Type1& b);         // a >> b
Type1& operator>>=(Type1& a, const Type1& b);              // a >>= b
Type1  operator~(const Type1& a);                          // ~a
Type1  operator&(const Type1& a, const Type1& b);          // a & b
Type1& operator&=(Type1& a, const Type1& b);               // a &= b
Type1  operator|(const Type1& a, const Type1& b);          // a | b
Type1& operator|=(Type1& a, const Type1& b);               // a |= b
Type1  operator^(const Type1& a, const Type1& b);          // a ^ b
Type1& operator^=(Type1& a, const Type1& b);               // a ^= b

// other operators
Type1&       Type1::operator=(const Type1& b);             // a = b
void         operator()(Type1& a);                         // a()
const Type2& operator[](const Type1& a, const Type1& b);   // a[b]
Type2&       operator*(const Type1& a);                    // *a
Type2*       operator&(const Type1& a);                    // &a
Type2*       Type1::operator->();                          // a->b
             Type1::operator type();                       // (type)a
Type2&       operator,(const Type1& a, Type2& b);          // a, b
void *       Type1::operator new(size_t x);                // new Type1
void *       Type1::operator new[](size_t x);              // new Type1[n]
void *       Type1::operator delete(size_t x);             // delete a
void *       Type1::operator delete[](size_t x);           // delete [] a

// Misc examples
int& operator*();
     Foo::operator const char *();
     Foo::operator const Bar&();

