From 28285e9df361d3ec93dc180b0c8dcfa4d6cb9af7 Mon Sep 17 00:00:00 2001 From: Kolan Sh Date: Mon, 30 Apr 2012 18:59:30 +0400 Subject: [PATCH] Initial commit --- ColoredSquare.c | 91 +++++++++++++++++++++++++++++++++++ ColoredSquare.h | 40 ++++++++++++++++ Figure.h | 24 ++++++++++ Makefile | 125 ++++++++++++++++++++++++++++++++++++++++++++++++ Object.h | 11 +++++ Square.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++ Square.h | 43 +++++++++++++++++ main.c | 38 +++++++++++++++ 8 files changed, 497 insertions(+) create mode 100644 ColoredSquare.c create mode 100644 ColoredSquare.h create mode 100644 Figure.h create mode 100644 Makefile create mode 100644 Object.h create mode 100644 Square.c create mode 100644 Square.h create mode 100644 main.c diff --git a/ColoredSquare.c b/ColoredSquare.c new file mode 100644 index 0000000..b130f8f --- /dev/null +++ b/ColoredSquare.c @@ -0,0 +1,91 @@ +#include + +#include "ColoredSquare.h" + +void ColoredSquare_constructor (void *this) +{ + printf ("ColoredSquare_constructor (%lu) called\n", + (unsigned long) this); + Square_constructor (this); + ((ColoredSquare *) this)->color = 0; +} + +void ColoredSquare_copy (void *to, void *from) +{ + printf ("ColoredSquare_copy (%lu, %lu) called\n", + (unsigned long) to, + (unsigned long) from); + Square_copy (to, from); + ((ColoredSquare *) to)->color = ((ColoredSquare *) from)->color; +} + +void* ColoredSquare_clone (void *this) +{ + ColoredSquare *csquare = ColoredSquare_new (); + 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 (void *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 (void *this) +{ + printf ("ColoredSquare_draw (%lu) called\n", + (unsigned long) this); + printf ("Drawing ColoredSquare with %f side and %d color\n", + ((ColoredSquare *) this)->a, + ((ColoredSquare *) this)->color); +} + +void ColoredSquare_set_color (void *this, int color) +{ + printf ("ColoredSquare_draw (%lu, %d) called\n", + (unsigned long) this, + color); + + ((ColoredSquare *) this)->color = color; +} + +/* public */ +void* ColoredSquare_new () +{ + static ColoredSquare_interface vtable = + { + ColoredSquare_clone, + Square_destroy, + ColoredSquare_type, + ColoredSquare_draw, + Square_area, + Square_resize, + Square_diag_length, + ColoredSquare_set_color + }; + ColoredSquare *square = malloc (sizeof (*square)); + + printf ("ColoredSquare_new () returns %lu\n", + (unsigned long) square); + + square->vtable = (void *) &vtable; + +/*goto end; +err: + +end:*/ + + return square; +} diff --git a/ColoredSquare.h b/ColoredSquare.h new file mode 100644 index 0000000..fbf411c --- /dev/null +++ b/ColoredSquare.h @@ -0,0 +1,40 @@ +#ifndef __COLORED_SQUARE_H__ +#define __COLORED_SQUARE_H__ + +#include "Square.h" + +typedef struct ColoredSquare_data +{ + Square_data; + + int color; + +} ColoredSquare_data; + +typedef struct ColoredSquare_interface +{ + Square_interface; + + void (*set_color) (void *this, int color); + +} ColoredSquare_interface; + +void ColoredSquare_constructor (void *this); +void ColoredSquare_copy (void *to, void *from); +void* ColoredSquare_clone (void *this); +const char* ColoredSquare_type (void *this); +void ColoredSquare_draw (void *this); +void ColoredSquare_set_color (void *this, int color); + +/* public */ +typedef struct ColoredSquare +{ + ColoredSquare_interface *vtable; + + ColoredSquare_data; + +} ColoredSquare; + +void* ColoredSquare_new (); + +#endif // __COLORED_SQUARE_H__ diff --git a/Figure.h b/Figure.h new file mode 100644 index 0000000..3b3a19a --- /dev/null +++ b/Figure.h @@ -0,0 +1,24 @@ +#ifndef __FIGURE_H__ +#define __FIGURE_H__ + +#include + +#include "Object.h" + +typedef struct Figure_interface +{ + Object_interface; + + const char* (*type) (void *this); + void (*draw) (void *this); + double (*area) (void *this); + +} Figure_interface; + +typedef struct Figure +{ + Figure_interface *vtable; + +} Figure; + +#endif // __FIGURE_H__ diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4739c01 --- /dev/null +++ b/Makefile @@ -0,0 +1,125 @@ +# Makefile generated by command: smake.sh -t main --cflags=-fms-extensions +# This file is generated with smake.sh. +# You can use this make file with instruction make to +# use one of build mode: debug, profile, develop, release. +# No need to call make clean if You make with other mode, +# because the Makefile containes rules for automatically clean. +# Some usage examples: +# make # default mode is debug +# CFLAGS="-O2 -march=core2 -mtune=core2 -msse4.1 -mfpmath=sse -fomit-frame-pointer -pipe" LDFLAGS="-Wl,-O1" make mode=develop +# CFLAGS="-O2 -march=amdfam10 -mtune=amdfam10 -msse4a --mfpmath=sse -fomit-frame-pointer -pipe" LDFLAGS="-Wl,-O1" make mode=profile +# CFLAGS="-O2 -march=k6-2 -mtune=k6-2 -m3dnow --mfpmath=387 -fomit-frame-pointer -pipe" LDFLAGS="-Wl,-O1" make mode=release +# Report bugs to + +#_________________________________ +# ENVIRONMENT | +#________________________________| +TARGET0=main +TARGETS= $(TARGET0) +CC=cc +CXX=c++ +CFLAGS := -fms-extensions $(CFLAGS) +CXXFLAGS := $(CXXFLAGS) +LDFLAGS := $(LDFLAGS) +LIBS= +SRC= +INCLUDES= +#________________________________________ +# BUILD SCRIPT (don't change) | +#_______________________________________| +ifeq ($(mode),) + mode = debug +endif +ifeq ($(mode),debug) + CFLAGS := -O0 -g -DDEBUG -std=c99 -pedantic -Wextra -Wconversion $(CFLAGS) + LDFLAGS := $(LDFLAGS) +endif +ifeq ($(mode),profile) + CFLAGS := -O0 -g -DDEBUG -std=c99 -p -ftest-coverage -Wcoverage-mismatch $(CFLAGS) + LDFLAGS := -g -p $(LDFLAGS) +endif +ifeq ($(mode),develop) + CFLAGS := -O2 -g -DDEBUG -std=c99 $(CFLAGS) + LDFLAGS := -O1 $(LDFLAGS) +endif +ifeq ($(mode),release) + CFLAGS := -O2 -std=c99 $(CFLAGS) + LDFLAGS := -O1 $(LDFLAGS) +endif + +CFLAGS += -Wall $(INCLUDES) +LDFLAGS += -Wall $(LIBS) + +all: + @make change_make_options &>/dev/null + +make $(TARGETS) + +ifneq ($(mode),debug) +ifneq ($(mode),profile) +ifneq ($(mode),develop) +ifneq ($(mode),release) + @echo "Invalid build mode." + @echo "Please use 'make mode=release', 'make mode=develop', 'make mode=profile' or 'make mode=debug'" + @exit 1 +endif +endif +endif +endif + @echo ".........................." + @echo "Building on "$(mode)" mode " + @echo "CFLAGS=$(CFLAGS)" + @echo "LDFLAGS=$(LDFLAGS)" + @echo ".........................." + +OLD_BUILD_MODE=$(shell grep ^MODE make_options.out 2>/dev/null | sed 's~^MODE=~~') +OLD_BUILD_CFLAGS=$(shell grep ^CFLAGS make_options.out 2>/dev/null | sed 's~^CFLAGS=~~') +OLD_BUILD_LDFLAGS=$(shell grep ^LDFLAGS make_options.out 2>/dev/null | sed 's~^LDFLAGS=~~') +change_make_options: +ifneq ($(mode)|$(CFLAGS)|$(LDFLAGS), $(OLD_BUILD_MODE)|$(OLD_BUILD_CFLAGS)|$(OLD_BUILD_LDFLAGS)) + @echo CLEANING... + @make clean + @echo "MODE=$(mode)" > make_options.out + @echo "CFLAGS=$(CFLAGS)" >> make_options.out + @echo "LDFLAGS=$(LDFLAGS)" >> make_options.out +endif + +%.o : + $(CC) -c $(CFLAGS) $(SRC) -o $@ $< + +clean: + $(RM) *.o *.out callgrind.out.* *.gcno $(TARGETS) + +.PHONY: all change_make_options clean + +#_________________________________ +# R U L E S | +#________________________________| +target_objs0 = \ + main.o \ + ColoredSquare.o \ + Square.o + +$(TARGET0): $(target_objs0) + $(CC) $(LDFLAGS) -o $@ $(target_objs0) + + +main.o: \ + main.c \ + ColoredSquare.h \ + Figure.h \ + Object.h \ + Square.h + +ColoredSquare.o: \ + ColoredSquare.c \ + ColoredSquare.h \ + Figure.h \ + Object.h \ + Square.h + +Square.o: \ + Square.c \ + Figure.h \ + Object.h \ + Square.h + diff --git a/Object.h b/Object.h new file mode 100644 index 0000000..e8f96a0 --- /dev/null +++ b/Object.h @@ -0,0 +1,11 @@ +#ifndef __OBJECT_H__ +#define __OBJECT_H__ + +typedef struct Object_interface +{ + void* (*clone) (void *this); + void (*destroy) (void *this); + +} Object_interface; + +#endif // __OBJECT_H__ diff --git a/Square.c b/Square.c new file mode 100644 index 0000000..2e4de45 --- /dev/null +++ b/Square.c @@ -0,0 +1,125 @@ +#include + +#include "Square.h" + +void Square_constructor (void *this) +{ + printf ("Square_constructor (%lu) called\n", + (unsigned long) this); + ((Square *) this)->a = 0.0; +} + +void Square_destructor (void *this) +{ + printf ("Square_destructor (%lu) called\n", + (unsigned long) this); +} + +void Square_copy (void *to, void *from) +{ + printf ("Square_copy (%lu, %lu) called\n", + (unsigned long) to, + (unsigned long) from); + ((Square *) to)->a = ((Square *) from)->a; +} + +void* Square_clone (void *this) +{ + Square *square = Square_new (); + 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 (void *this) +{ + printf ("Square_destroy (%lu) called\n", + (unsigned long) this); + free (this); +} + +const char* Square_type (void *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 (void *this) +{ + printf ("Square_draw (%lu) called\n", + (unsigned long) this); + printf ("Drawing Square with %f side\n", + ((Square *) this)->a); +} + +double Square_area (void *this) +{ + double area = ((Square *)this)->a * ((Square *)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 (void *this, double a) +{ + printf ("Square_resize (%lu, %f) called\n", + (unsigned long) this, + a); + ((Square *) this)->a = a; +} + +double Square_diag_length (void *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 */ +void* Square_new () +{ + static Square_interface vtable = + { + Square_clone, + Square_destroy, + Square_type, + Square_draw, + Square_area, + Square_resize, + Square_diag_length + }; + Square *square = malloc (sizeof (*square)); + + printf ("Square_new () returns %lu\n", + (unsigned long) square); + + square->vtable = (void *) &vtable; + +/*goto end; +err: + +end:*/ + + return square; +} diff --git a/Square.h b/Square.h new file mode 100644 index 0000000..74d3b4a --- /dev/null +++ b/Square.h @@ -0,0 +1,43 @@ +#ifndef __SQUARE_H__ +#define __SQUARE_H__ + +#include "Figure.h" + +typedef struct Square_data +{ + double a; + +} Square_data; + +typedef struct Square_interface +{ + Figure_interface; + + void (*resize) (void *this, double a); + double (*diag_length) (void *this); + +} Square_interface; + +void Square_constructor (void *this); +void Square_destructor (void *this); +void Square_copy (void *to, void *from); +void* Square_clone (void *this); +void Square_destroy (void *this); +const char* Square_type (void *this); +void Square_draw (void *this); +double Square_area (void *this); +void Square_resize (void *this, double a); +double Square_diag_length (void *this); + +/* public */ +typedef struct Square +{ + Square_interface *vtable; + + Square_data; + +} Square; + +void* Square_new (); + +#endif // __SQUARE_H__ diff --git a/main.c b/main.c new file mode 100644 index 0000000..388be36 --- /dev/null +++ b/main.c @@ -0,0 +1,38 @@ +#include +#include + +#include "ColoredSquare.h" + +int main (int argc, char *argv[]) +{ + Figure *fig[2]; + + fig[0] = Square_new (); + fig[1] = ColoredSquare_new (); + + ((ColoredSquare *) fig[1])->vtable->set_color (fig[1], 5); + ((Square *) fig[0])->vtable->resize (fig[0], 2); + ((Square *) fig[1])->vtable->resize (fig[0], 3); + + fig[0]->vtable->draw (fig[0]); + fig[1]->vtable->draw (fig[1]); + + printf ("area(%lu) = %f\n", + (unsigned long) fig[0], + fig[0]->vtable->area (fig[0])); + printf ("area(%lu) = %f\n", + (unsigned long) fig[1], + fig[1]->vtable->area (fig[1])); + + printf ("diag_length(%lu) = %f\n", + (unsigned long) fig[0], + ((Square *) fig[0])->vtable->diag_length (fig[0])); + +/*goto end; +err: +end:*/ + fig[0]->vtable->destroy (fig[0]); + fig[1]->vtable->destroy (fig[1]); + + return 0; +}