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

