/* 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&();

