Go to the documentation of this file.00001
00024 #include "derived2.h"
00025 #include "derived1_friend.h"
00026
00028 #define DERIVED2_STR_SIZE 256
00029
00031 typedef struct derived2_st_ {
00033 derived1_st derived1;
00034 } derived2_st;
00035
00042 static derived2_handle
00043 derived1_cast_to_derived2 (derived1_handle derived1_h)
00044 {
00045 derived2_handle derived2_h = NULL;
00046
00047 if (NULL != derived1_h) {
00048 derived2_h = (derived2_handle) ((uint8_t *) derived1_h -
00049 offsetof(derived2_st, derived1));
00050 }
00051
00052 return (derived2_h);
00053 }
00054
00061 static derived2_handle
00062 base1_cast_to_derived2 (base1_handle base1_h)
00063 {
00064 derived2_handle derived2_h = NULL;
00065
00066 if (NULL != base1_h) {
00067 derived2_h = (derived2_handle) ((uint8_t *) base1_h -
00068 offsetof(derived2_st, derived1) -
00069 offsetof(derived1_st, base1));
00070 }
00071
00072 return (derived2_h);
00073 }
00074
00081 static derived2_handle
00082 base2_cast_to_derived2 (base2_handle base2_h)
00083 {
00084 derived2_handle derived2_h = NULL;
00085
00086 if (NULL != base2_h) {
00087 derived2_h = (derived2_handle) ((uint8_t *) base2_h -
00088 offsetof(derived2_st, derived1) -
00089 offsetof(derived1_st, base2));
00090 }
00091
00092 return (derived2_h);
00093 }
00094
00102 static my_rc_e
00103 derived2_derived1_increase_val4 (derived1_handle derived1_h)
00104 {
00105 if (NULL == derived1_h) {
00106 LOG_ERR("Invalid input, derived1_h(%p)", derived1_h);
00107 return (MY_RC_E_EINVAL);
00108 }
00109
00110 derived1_h->val4 += 20;
00111
00112 return (MY_RC_E_SUCCESS);
00113 }
00114
00122 static const char *
00123 derived2_type_string_internal (derived2_handle derived2_h)
00124 {
00125 return ("derived2");
00126 }
00127
00134 static const char *
00135 derived2_base1_type_string (base1_handle base1_h)
00136 {
00137 return (derived2_type_string_internal(base1_cast_to_derived2(base1_h)));
00138 }
00139
00146 static const char *
00147 derived2_base2_type_string (base2_handle base2_h)
00148 {
00149 return (derived2_type_string_internal(base2_cast_to_derived2(base2_h)));
00150 }
00151
00158 static void
00159 derived2_delete (derived2_handle derived2_h)
00160 {
00161 if (NULL == derived2_h) {
00162 return;
00163 }
00164
00165 derived1_friend_delete(&(derived2_h->derived1));
00166
00167 free(derived2_h);
00168 }
00169
00176 static void
00177 derived2_base1_delete (base1_handle base1_h)
00178 {
00179 return (derived2_delete(base1_cast_to_derived2(base1_h)));
00180 }
00181
00188 static void
00189 derived2_base2_delete (base2_handle base2_h)
00190 {
00191 return (derived2_delete(base2_cast_to_derived2(base2_h)));
00192 }
00193
00200 static void
00201 derived2_derived1_delete (derived1_handle derived1_h)
00202 {
00203 return (derived2_delete(derived1_cast_to_derived2(derived1_h)));
00204 }
00205
00206
00212 static base1_vtable_st base1_vtable = {
00213 derived2_base1_delete,
00214 derived2_base1_type_string,
00215 NULL,
00216 NULL,
00217 NULL
00218 };
00219
00225 static base2_vtable_st base2_vtable = {
00226 derived2_base2_delete,
00227 derived2_base2_type_string,
00228 NULL,
00229 NULL,
00230 NULL
00231 };
00232
00238 static derived1_vtable_st derived1_vtable = {
00239 &base1_vtable,
00240 &base2_vtable,
00241 derived2_derived1_delete,
00242 derived2_derived1_increase_val4
00243 };
00244
00251 derived1_handle
00252 derived2_cast_to_derived1 (derived2_handle derived2_h)
00253 {
00254 derived1_handle derived1_h = NULL;
00255
00256 if (NULL != derived2_h) {
00257 derived1_h = &(derived2_h->derived1);
00258 }
00259
00260 return (derived1_h);
00261 }
00262
00269 static my_rc_e
00270 derived2_init (derived2_handle derived2_h)
00271 {
00272 my_rc_e rc = MY_RC_E_SUCCESS;
00273
00274 if (NULL == derived2_h) {
00275 LOG_ERR("Invalid input, derived2_h(%p)", derived2_h);
00276 return (MY_RC_E_EINVAL);
00277 }
00278
00279 rc = derived1_init(&(derived2_h->derived1));
00280 if (my_rc_e_is_notok(rc)) {
00281 return (rc);
00282 }
00283
00284 rc = derived1_set_vtable(&(derived2_h->derived1), &derived1_vtable);
00285 if (my_rc_e_is_notok(rc)) {
00286 return (rc);
00287 }
00288
00289 derived2_h->derived1.base2.val1 = 999;
00290 derived2_h->derived1.val4 = 700;
00291
00292 return (MY_RC_E_SUCCESS);
00293 }
00294
00295
00301 derived2_handle
00302 derived2_new1 (void)
00303 {
00304 derived2_st *derived2 = NULL;
00305 my_rc_e rc;
00306
00307 derived2 = calloc(1, sizeof(*derived2));
00308 if (NULL != derived2) {
00309 rc = derived2_init(derived2);
00310 if (my_rc_e_is_notok(rc)) {
00311 LOG_ERR("Init failed, rc(%s)", my_rc_e_get_string(rc));
00312 goto err_exit;
00313 }
00314 }
00315
00316 return (derived2);
00317
00318 err_exit:
00319
00320 derived2_delete(derived2);
00321
00322 return (NULL);
00323 }