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

