#include <stddef.h>

class foo {
public:
  foo  (int);
  foo  (int, const char *);
  foo  (foo&);
  ~foo ();
  void foofunc (int);
  void foofunc (int, signed char *);
  int ifoo;
  const char *ccpfoo;

int overload1arg (void);
int overload1arg (char);         
int overload1arg (signed char);
int overload1arg (unsigned char);
int overload1arg (short);
int overload1arg (unsigned short);
int overload1arg (int);
int overload1arg (unsigned int);
int overload1arg (long);
int overload1arg (unsigned long);
int overload1arg (float);
int overload1arg (double);

int overloadargs (int a1);
int overloadargs (int a1, int a2);
int overloadargs (int a1, int a2, int a3);
int overloadargs (int a1, int a2, int a3, int a4);
int overloadargs (int a1, int a2, int a3, int a4, int a5);
int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6);
int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7);
int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8);
int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9);
int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
                   int a8, int a9, int a10);
int overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
                   int a8, int a9, int a10, int a11);


};

void marker1()
{}

int main () 
{
    char arg2 = 2;
    signed char arg3 =3;
    unsigned char arg4 =4;
    short arg5 =5;
    unsigned short arg6 =6;
    int arg7 =7;
    unsigned int arg8 =8;
    long arg9 =9;
    unsigned long arg10 =10;
    float arg11 =100.0;
    double arg12 = 200.0;

    char ch='A';
    foo foo_instance1(111);
    foo foo_instance2(222, &ch);
    foo foo_instance3(foo_instance2);

    foo_instance1.overload1arg();
    foo_instance1.overload1arg(arg2);
    foo_instance1.overload1arg(arg3);
    foo_instance1.overload1arg(arg4);
    foo_instance1.overload1arg(arg5);
    foo_instance1.overload1arg(arg6);
    foo_instance1.overload1arg(arg7);
    foo_instance1.overload1arg(arg8);
    foo_instance1.overload1arg(arg9);
    foo_instance1.overload1arg(arg10);
    foo_instance1.overload1arg(arg11);
    foo_instance1.overload1arg(arg12);

    foo_instance1.overloadargs(1);
    foo_instance1.overloadargs(1, 2);
    foo_instance1.overloadargs(1, 2, 3);
    foo_instance1.overloadargs(1, 2, 3, 4);
    foo_instance1.overloadargs(1, 2, 3, 4, 5);
    foo_instance1.overloadargs(1, 2, 3, 4, 5, 6);
    foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7);
    foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8);
    foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9);
    foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
    foo_instance1.overloadargs(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
   



    marker1();
    return 0; 
}

foo::foo  (int i)                  { ifoo = i;}
foo::foo  (int i, const char *ccp) { ifoo = i; ccpfoo = ccp; }
foo::foo  (foo& afoo)              { ifoo = afoo.ifoo; ccpfoo = afoo.ccpfoo;}
foo::~foo ()                       {}


/* Some functions to test overloading by varying one argument type. */

int foo::overload1arg (void)
{ return 1; } /* fo1 void */

int foo::overload1arg (char arg)
{ arg = 0; return 2; } /* fo1 char */

int foo::overload1arg (signed char arg)
{ arg = 0; return 3; } /* fo1 signed_char */

int foo::overload1arg (unsigned char arg)
{ arg = 0; return 4; } /* fo1 unsigned_char */

int foo::overload1arg (short arg)
{ arg = 0; return 5; } /* fo1 short_int */

int foo::overload1arg (unsigned short arg)
{ arg = 0; return 6; } /* fo1 unsigned_short_int */

int foo::overload1arg (int arg)
{ arg = 0; return 7; } /* fo1 int */

int foo::overload1arg (unsigned int arg)
{ arg = 0; return 8; } /* fo1 unsigned_int */

int foo::overload1arg (long arg)
{ arg = 0; return 9; } /* fo1 long_int */

int foo::overload1arg (unsigned long arg)
{ arg = 0; return 10; } /* fo1 unsigned_long_int */

int foo::overload1arg (float arg)
{ arg = 0; return 11; } /* fo1 float */

int foo::overload1arg (double arg)
{ arg = 0; return 12; } /* fo1 double */


/* Some functions to test overloading by varying argument count. */

int foo::overloadargs (int a1)                 
{ a1 = 0; 
return 1;}

int foo::overloadargs (int a1, int a2)          
{ a1 = a2 = 0; 
return 2;}

int foo::overloadargs (int a1, int a2, int a3)              
{ a1 = a2 = a3 = 0; 
return 3;}

int foo::overloadargs (int a1, int a2, int a3, int a4)
{ a1 = a2 = a3 = a4 = 0; 
return 4;}

int foo::overloadargs (int a1, int a2, int a3, int a4, int a5)
{ a1 = a2 = a3 = a4 = a5 = 0; 
return 5;}

int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6)
{ a1 = a2 = a3 = a4 = a5 = a6 = 0; 
return 6;}

int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7)
{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = 0; 
return 7;}

int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
                   int a8)
{ a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = 0; 
return 8;}

int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
                   int a8, int a9)
{ 
  a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 = 0; 
  return 9;
}

int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
                   int a8, int a9, int a10)
                        { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 =
                          a10 = 0; return 10;}

int foo::overloadargs (int a1, int a2, int a3, int a4, int a5, int a6, int a7,
                   int a8, int a9, int a10, int a11)
                        { a1 = a2 = a3 = a4 = a5 = a6 = a7 = a8 = a9 =
                          a10 = a11 = 0; return 11;}


void foo::foofunc (int a)
{
}

void foo::foofunc (int b, signed char *c)
{
}

