Creating very nice C API
This commit is contained in:
parent
14b295c886
commit
079b09287d
106
ColoredSquare.c
106
ColoredSquare.c
|
@ -1,106 +0,0 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "ColoredSquare.h"
|
||||
|
||||
void ColoredSquare_constructor (ColoredSquare *this,
|
||||
double a,
|
||||
int color)
|
||||
{
|
||||
printf ("ColoredSquare_constructor (%lu, %f, %d) called\n",
|
||||
(unsigned long) this,
|
||||
a,
|
||||
color);
|
||||
Square_constructor ((Square *) this, a);
|
||||
this->color = color;
|
||||
}
|
||||
|
||||
void ColoredSquare_copy (ColoredSquare *dest, const ColoredSquare *src)
|
||||
{
|
||||
printf ("ColoredSquare_copy (%lu, %lu) called\n",
|
||||
(unsigned long) dest,
|
||||
(unsigned long) src);
|
||||
Square_copy ((Square *) dest, (Square *) src);
|
||||
dest->color = src->color;
|
||||
}
|
||||
|
||||
ColoredSquare* ColoredSquare_clone (const ColoredSquare *this)
|
||||
{
|
||||
ColoredSquare *csquare = ColoredSquare_new (0.0, 0);
|
||||
printf ("ColoredSquare_clone (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
ColoredSquare_copy (csquare, this);
|
||||
printf ("ColoredSquare_clone (%lu) returns %lu\n",
|
||||
(unsigned long) this,
|
||||
(unsigned long) csquare);
|
||||
|
||||
return csquare;
|
||||
}
|
||||
|
||||
const char* ColoredSquare_type (const ColoredSquare *this)
|
||||
{
|
||||
static const char *csquare_type_str = "ColoredSquare";
|
||||
printf ("ColoredSquare_type (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
printf ("ColoredSquare_type (%lu) returns \"%s\"\n",
|
||||
(unsigned long) this,
|
||||
csquare_type_str);
|
||||
return csquare_type_str;
|
||||
}
|
||||
|
||||
void ColoredSquare_draw (const ColoredSquare *this)
|
||||
{
|
||||
printf ("ColoredSquare_draw (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
printf ("Drawing ColoredSquare with %f side and %d color\n",
|
||||
this->a,
|
||||
this->color);
|
||||
}
|
||||
|
||||
void ColoredSquare_set_color (ColoredSquare *this, int color)
|
||||
{
|
||||
printf ("ColoredSquare_draw (%lu, %d) called\n",
|
||||
(unsigned long) this,
|
||||
color);
|
||||
|
||||
this->color = color;
|
||||
}
|
||||
|
||||
/* public */
|
||||
ColoredSquare* ColoredSquare_new (double a, int color)
|
||||
{
|
||||
static ColoredSquare_interface vtable =
|
||||
{
|
||||
{
|
||||
{
|
||||
{
|
||||
(void* (*) (const void *)) ColoredSquare_clone,
|
||||
(void (*) (void *)) Square_destroy
|
||||
},
|
||||
(const char* (*) (const Figure *)) ColoredSquare_type,
|
||||
(void (*) (const Figure *)) ColoredSquare_draw,
|
||||
(double (*) (const Figure *)) Square_area
|
||||
},
|
||||
Square_resize,
|
||||
Square_diag_length
|
||||
},
|
||||
ColoredSquare_set_color
|
||||
};
|
||||
ColoredSquare *square = malloc (sizeof (*square));
|
||||
|
||||
ColoredSquare_constructor (square, a, color);
|
||||
|
||||
printf ("ColoredSquare_new (%f, %d) returns %lu\n",
|
||||
a,
|
||||
color,
|
||||
(unsigned long) square);
|
||||
|
||||
square->vtable = &vtable;
|
||||
|
||||
/*goto end;
|
||||
err:
|
||||
|
||||
end:*/
|
||||
|
||||
return square;
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
#ifndef __COLORED_SQUARE_H__
|
||||
#define __COLORED_SQUARE_H__
|
||||
|
||||
#include "Square.h"
|
||||
|
||||
typedef struct ColoredSquare_data
|
||||
{
|
||||
Square_data;
|
||||
|
||||
int color;
|
||||
|
||||
} ColoredSquare_data;
|
||||
|
||||
struct ColoredSquare;
|
||||
|
||||
typedef struct ColoredSquare_interface
|
||||
{
|
||||
Square_interface;
|
||||
|
||||
void (*set_color) (struct ColoredSquare *this, int color);
|
||||
|
||||
} ColoredSquare_interface;
|
||||
|
||||
void ColoredSquare_constructor (struct ColoredSquare *this,
|
||||
double a,
|
||||
int color);
|
||||
void ColoredSquare_copy (struct ColoredSquare *dest, const struct ColoredSquare *src);
|
||||
struct ColoredSquare* ColoredSquare_clone (const struct ColoredSquare *this);
|
||||
const char* ColoredSquare_type (const struct ColoredSquare *this);
|
||||
void ColoredSquare_draw (const struct ColoredSquare *this);
|
||||
void ColoredSquare_set_color (struct ColoredSquare *this, int color);
|
||||
|
||||
/* public */
|
||||
typedef struct ColoredSquare
|
||||
{
|
||||
ColoredSquare_interface *vtable;
|
||||
|
||||
ColoredSquare_data;
|
||||
|
||||
} ColoredSquare;
|
||||
|
||||
ColoredSquare* ColoredSquare_new (double a, int color);
|
||||
|
||||
#endif // __COLORED_SQUARE_H__
|
|
@ -0,0 +1,17 @@
|
|||
#include "Figure.h"
|
||||
|
||||
/* considered to be protected */
|
||||
void Figure_constructor (Figure *this)
|
||||
{
|
||||
// nothin here
|
||||
}
|
||||
|
||||
void Figure_destructor (Figure *this)
|
||||
{
|
||||
// nothin here
|
||||
}
|
||||
|
||||
void Figure_copy (struct Figure *dest, const struct Figure *src)
|
||||
{
|
||||
// nothin here
|
||||
}
|
51
Figure.h
51
Figure.h
|
@ -3,22 +3,47 @@
|
|||
|
||||
#include "Object.h"
|
||||
|
||||
struct Figure;
|
||||
|
||||
typedef struct Figure_interface
|
||||
{
|
||||
Object_interface;
|
||||
|
||||
const char* (*type) (const struct Figure *this);
|
||||
void (*draw) (const struct Figure *this);
|
||||
double (*area) (const struct Figure *this);
|
||||
|
||||
} Figure_interface;
|
||||
|
||||
typedef struct Figure
|
||||
{
|
||||
Figure_interface *vtable;
|
||||
struct Figure_vtable
|
||||
{
|
||||
/* derived from Object */
|
||||
const char* (*type) ();
|
||||
struct Figure* (*clone) (const struct Figure *this);
|
||||
void (*destroy) (struct Figure *this);
|
||||
|
||||
/* Figure virtual methods */
|
||||
void (*draw) (const struct Figure *this);
|
||||
double (*area) (const struct Figure *this);
|
||||
|
||||
} *vtable;
|
||||
|
||||
} Figure;
|
||||
|
||||
static inline const char* Figure_type (const Figure *this)
|
||||
{
|
||||
return this->vtable->type ();
|
||||
}
|
||||
static inline Figure* Figure_clone (const Figure *this)
|
||||
{
|
||||
return this->vtable->clone (this);
|
||||
}
|
||||
static inline void Figure_destroy (Figure *this)
|
||||
{
|
||||
this->vtable->destroy (this);
|
||||
}
|
||||
static inline void Figure_draw (const struct Figure *this)
|
||||
{
|
||||
this->vtable->draw (this);
|
||||
}
|
||||
static inline double (*area) (const struct Figure *this)
|
||||
{
|
||||
return this->vtable->area (this);
|
||||
}
|
||||
|
||||
/* considered to be protected */
|
||||
void Figure_constructor (Figure *this);
|
||||
void Figure_destructor (Figure *this);
|
||||
void Figure_copy (struct Figure *dest, const struct Figure *src);
|
||||
|
||||
#endif // __FIGURE_H__
|
||||
|
|
14
Object.h
14
Object.h
|
@ -1,11 +1,17 @@
|
|||
#ifndef __OBJECT_H__
|
||||
#define __OBJECT_H__
|
||||
|
||||
typedef struct Object_interface
|
||||
typedef struct Object
|
||||
{
|
||||
void* (*clone) (const void *this);
|
||||
void (*destroy) (void *this);
|
||||
struct Object_vtable
|
||||
{
|
||||
/* Object methods */
|
||||
const char* (*type) ();
|
||||
struct Object* (*clone) (const Object *this);
|
||||
void (*destroy) (struct Object *this);
|
||||
|
||||
} *vtable;
|
||||
|
||||
} Object_interface;
|
||||
} Object;
|
||||
|
||||
#endif // __OBJECT_H__
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
#ifndef __POLYGON_H__
|
||||
#define __POLYGON_H__
|
||||
|
||||
#include "Figure.h"
|
||||
|
||||
typedef struct Polygon
|
||||
{
|
||||
struct Polygon_vtable
|
||||
{
|
||||
/* derived from Object */
|
||||
const char* (*type) ();
|
||||
struct Polygon* (*clone) (const struct Polygon *this);
|
||||
void (*destroy) (struct Polygon *this);
|
||||
|
||||
/* derived from Figure */
|
||||
void (*draw) (const struct Polygon *this);
|
||||
double (*area) (const struct Polygon *this);
|
||||
|
||||
/* Polygon virtual methods */
|
||||
double (*max_diag) (const struct Polygon *this);
|
||||
|
||||
} *vtable;
|
||||
|
||||
/* Polygon fields */
|
||||
struct point
|
||||
{
|
||||
double x, y;
|
||||
|
||||
} *points;
|
||||
|
||||
} Polygon;
|
||||
|
||||
Polygon* Polygon_new (const struct *points);
|
||||
|
||||
static inline const char* Polygon_type (const Polygon *this)
|
||||
{
|
||||
return this->vtable->type ();
|
||||
}
|
||||
|
||||
static inline Polygon* Polygon_clone (const Polygon *this)
|
||||
{
|
||||
return this->vtable->clone (this);
|
||||
}
|
||||
|
||||
static inline void Polygon_destroy (Polygon *this)
|
||||
{
|
||||
this->vtable->destroy (this);
|
||||
}
|
||||
|
||||
static inline void Polygon_draw (const Polygon *this)
|
||||
{
|
||||
this->vtable->draw (this);
|
||||
}
|
||||
|
||||
static inline double Polygon_area (const Polygon *this)
|
||||
{
|
||||
return this->vtable->area (this);
|
||||
}
|
||||
|
||||
static inline double Polygon_max_diag (const Polygon *this)
|
||||
{
|
||||
return this->max_diag (this);
|
||||
}
|
||||
|
||||
/* considered to be protected */
|
||||
void Polygon_constructor (Polygon *this);
|
||||
void Polygon_destructor (Polygon *this);
|
||||
void Polygon_copy (Polygon *dest, const Polygon *src);
|
||||
|
||||
#endif // __POLYGON_H__
|
|
@ -0,0 +1,75 @@
|
|||
#ifndef __RHOMB_H__
|
||||
#define __RHOMB_H__
|
||||
|
||||
#include "Polygon.h"
|
||||
|
||||
typedef struct Rhomb
|
||||
{
|
||||
struct Rhomb_vtable
|
||||
{
|
||||
/* derived from Object */
|
||||
const char* (*type) ();
|
||||
struct Rhomb* (*clone) (const struct Rhomb *this);
|
||||
void (*destroy) (struct Rhomb *this);
|
||||
|
||||
/* derived from Figure */
|
||||
void (*draw) (const struct Rhomb *this);
|
||||
double (*area) (const struct Rhomb *this);
|
||||
|
||||
/* derived from Polygon */
|
||||
double (*max_diag) (const struct Rhomb *this);
|
||||
|
||||
/* Rhomb virtual methods */
|
||||
int (*is_square) (const struct Rhomb *this);
|
||||
|
||||
} *vtable;
|
||||
|
||||
/* derived from Polygon */
|
||||
struct point
|
||||
{
|
||||
double x, y;
|
||||
|
||||
} *points;
|
||||
|
||||
} Rhomb;
|
||||
|
||||
Rhomb* Rhomb_new (const struct *points);
|
||||
|
||||
static inline const char* Rhomb_type (const Rhomb *this)
|
||||
{
|
||||
return this->vtable->type ();
|
||||
}
|
||||
|
||||
static inline Rhomb* Rhomb_clone (const Rhomb *this)
|
||||
{
|
||||
return this->vtable->clone (this);
|
||||
}
|
||||
|
||||
static inline void Rhomb_destroy (Rhomb *this)
|
||||
{
|
||||
this->vtable->destroy (this);
|
||||
}
|
||||
|
||||
static inline void Rhomb_draw (const Rhomb *this)
|
||||
{
|
||||
this->vtable->draw (this);
|
||||
}
|
||||
|
||||
static int double Rhomb_area (const Rhomb *this)
|
||||
{
|
||||
return this->vtable_area (this);
|
||||
}
|
||||
|
||||
static inline double Rhomb_max_diag (const Rhomb *this)
|
||||
{
|
||||
return this->max_diag (this);
|
||||
}
|
||||
|
||||
static inline int Rhomb_is_square (const Rhomb *this);
|
||||
|
||||
/* considered to be protected */
|
||||
void Rhomb_constructor (Rhomb *this);
|
||||
void Rhomb_destructor (Rhomb *this);
|
||||
void Rhomb_copy (Rhomb *dest, const Rhomb *src);
|
||||
|
||||
#endif // __RHOMB_H__
|
134
Square.c
134
Square.c
|
@ -1,134 +0,0 @@
|
|||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "Square.h"
|
||||
|
||||
void Square_constructor (Square *this, double a)
|
||||
{
|
||||
printf ("Square_constructor (%lu, %f) called\n",
|
||||
(unsigned long) this,
|
||||
a);
|
||||
this->a = a;
|
||||
}
|
||||
|
||||
void Square_destructor (Square *this)
|
||||
{
|
||||
printf ("Square_destructor (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
}
|
||||
|
||||
void Square_copy (Square *dest, const Square *src)
|
||||
{
|
||||
printf ("Square_copy (%lu, %lu) called\n",
|
||||
(unsigned long) dest,
|
||||
(unsigned long) src);
|
||||
dest->a = src->a;
|
||||
}
|
||||
|
||||
Square* Square_clone (const Square *this)
|
||||
{
|
||||
Square *square = Square_new (0.0);
|
||||
printf ("Square_clone (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
Square_copy (square, this);
|
||||
printf ("Square_clone (%lu) returns %lu\n",
|
||||
(unsigned long) this,
|
||||
(unsigned long) square);
|
||||
|
||||
return square;
|
||||
}
|
||||
|
||||
void Square_destroy (Square *this)
|
||||
{
|
||||
printf ("Square_destroy (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
free (this);
|
||||
}
|
||||
|
||||
const char* Square_type (const Square *this)
|
||||
{
|
||||
static const char *square_type_str = "Square";
|
||||
printf ("Square_type (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
printf ("Square_type (%lu) returns \"%s\"\n",
|
||||
(unsigned long) this,
|
||||
square_type_str);
|
||||
|
||||
return square_type_str;
|
||||
}
|
||||
|
||||
void Square_draw (const Square *this)
|
||||
{
|
||||
printf ("Square_draw (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
printf ("Drawing Square with %f side\n",
|
||||
this->a);
|
||||
}
|
||||
|
||||
double Square_area (const Square *this)
|
||||
{
|
||||
double area = this->a * this->a;
|
||||
printf ("Square_area (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
printf ("Square_area (%lu) returns %f\n",
|
||||
(unsigned long) this,
|
||||
area);
|
||||
|
||||
return area;
|
||||
}
|
||||
|
||||
void Square_resize (Square *this, double a)
|
||||
{
|
||||
printf ("Square_resize (%lu, %f) called\n",
|
||||
(unsigned long) this,
|
||||
a);
|
||||
this->a = a;
|
||||
}
|
||||
|
||||
double Square_diag_length (const Square *this)
|
||||
{
|
||||
double diag_length = ((Square *)this)->a * 1.41421356;
|
||||
|
||||
printf ("Square_diag_length (%lu) called\n",
|
||||
(unsigned long) this);
|
||||
printf ("Square_diag_length (%lu) returns %f\n",
|
||||
(unsigned long) this,
|
||||
diag_length);
|
||||
|
||||
return diag_length;
|
||||
}
|
||||
|
||||
/* public */
|
||||
Square* Square_new (double a)
|
||||
{
|
||||
static Square_interface vtable =
|
||||
{
|
||||
{
|
||||
{
|
||||
(void* (*) (const void *)) Square_clone,
|
||||
(void (*) (void *)) Square_destroy
|
||||
},
|
||||
(const char* (*) (const Figure *)) Square_type,
|
||||
(void (*) (const Figure *)) Square_draw,
|
||||
(double (*) (const Figure *)) Square_area
|
||||
},
|
||||
Square_resize,
|
||||
Square_diag_length
|
||||
};
|
||||
Square *square = malloc (sizeof (*square));
|
||||
|
||||
Square_constructor (square, a);
|
||||
|
||||
printf ("Square_new (%f) returns %lu\n",
|
||||
a,
|
||||
(unsigned long) square);
|
||||
|
||||
square->vtable = &vtable;
|
||||
|
||||
/*goto end;
|
||||
err:
|
||||
|
||||
end:*/
|
||||
|
||||
return square;
|
||||
}
|
45
Square.h
45
Square.h
|
@ -1,45 +0,0 @@
|
|||
#ifndef __SQUARE_H__
|
||||
#define __SQUARE_H__
|
||||
|
||||
#include "Figure.h"
|
||||
|
||||
typedef struct Square_data
|
||||
{
|
||||
double a;
|
||||
|
||||
} Square_data;
|
||||
|
||||
struct Square;
|
||||
|
||||
typedef struct Square_interface
|
||||
{
|
||||
Figure_interface;
|
||||
|
||||
void (*resize) (struct Square *this, double a);
|
||||
double (*diag_length) (const struct Square *this);
|
||||
|
||||
} Square_interface;
|
||||
|
||||
void Square_constructor (struct Square *this, double a);
|
||||
void Square_destructor (struct Square *this);
|
||||
void Square_copy (struct Square *dest, const struct Square *src);
|
||||
struct Square* Square_clone (const struct Square *this);
|
||||
void Square_destroy (struct Square *this);
|
||||
const char* Square_type (const struct Square *this);
|
||||
void Square_draw (const struct Square *this);
|
||||
double Square_area (const struct Square *this);
|
||||
void Square_resize (struct Square *this, double a);
|
||||
double Square_diag_length (const struct Square *this);
|
||||
|
||||
/* public */
|
||||
typedef struct Square
|
||||
{
|
||||
Square_interface *vtable;
|
||||
|
||||
Square_data;
|
||||
|
||||
} Square;
|
||||
|
||||
Square* Square_new (double a);
|
||||
|
||||
#endif // __SQUARE_H__
|
Loading…
Reference in New Issue