derived2.c
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 }
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines