Ignore:
Timestamp:
07/11/24 17:26:06 (2 months ago)
Author:
Maciej Komosinski
Message:

Offset of fields within an object: replaced subtraction of pointers/addresses with the official offsetof()

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpp/frams/param/param.h

    r1184 r1315  
    11// This file is a part of Framsticks SDK.  http://www.framsticks.com/
    2 // Copyright (C) 1999-2022  Maciej Komosinski and Szymon Ulatowski.
     2// Copyright (C) 1999-2024  Maciej Komosinski and Szymon Ulatowski.
    33// See LICENSE.txt for details.
    44
     
    216216// implementations:
    217217
    218 extern char MakeCodeGuardHappy;
    219 
    220218#define PROCOFFSET(_proc_) ( (void (*)(void*,ExtValue*,ExtValue*)) &(FIELDSTRUCT :: _proc_ ## _statrick))
    221219#define STATICPROCOFFSET(_proc_) ( (void (*)(void*,ExtValue*,ExtValue*)) &(FIELDSTRUCT :: _proc_))
     
    223221#define SETOFFSET(_proc_) ( (int (*)(void*,const ExtValue*)) &(FIELDSTRUCT :: _proc_ ## _statrick))
    224222
    225 #define FIELDOFFSET(_fld_) ((intptr_t)((char*)(&((FIELDSTRUCT*)&MakeCodeGuardHappy)->_fld_)-((char*)((FIELDSTRUCT*)&MakeCodeGuardHappy))))
     223#define FIELDOFFSET(_fld_) ((intptr_t)offsetof(FIELDSTRUCT, _fld_)) // https://stackoverflow.com/questions/177885/looking-for-something-similar-to-offsetof-for-non-pod-types , https://stackoverflow.com/questions/713963/why-does-this-implementation-of-offsetof-work
    226224
    227225#ifdef _DEBUG
     
    349347
    350348#ifdef CHECK_PARAMENTRY_COUNT
    351        
     349
    352350        template <int COUNT>
    353         Param(ParamEntry (&t)[COUNT],void* o = 0, const char*n = 0) :SimpleAbstractParam(o, n), tab(t)
     351        Param(ParamEntry(&t)[COUNT], void* o = 0, const char*n = 0) :SimpleAbstractParam(o, n), tab(t)
    354352        {
    355                 if (!n&&tab) myname = tab[0].name;
     353                if (!n && tab) myname = tab[0].name;
    356354                //printf("Param(ParamEntry t[%d]) %s\n",COUNT,myname?myname:"unknown name");
    357355                if (tab)
    358                         {
    359                         int in_array = COUNT-1-tab[0].group;
     356                {
     357                        int in_array = COUNT - 1 - tab[0].group;
    360358                        if (tab[0].flags != in_array)
    361                                 printf("\nCHECK_PARAMENTRY_COUNT: %d items in ParamEntry[] array, declared %d (%s)\n\n",in_array, tab[0].flags, myname?myname:"unknown name");
    362                         if (in_array>0 && tab[COUNT-1].id != NULL) //in_array>0 -> completely empty paramtab can't end with the usual zero row because that's also its first row
    363                                 printf("\nCHECK_PARAMENTRY_COUNT: last entry is not null (%s)\n\n",myname?myname:"unknown name");
    364                         }
     359                                printf("\nCHECK_PARAMENTRY_COUNT: %d items in ParamEntry[] array, declared %d (%s)\n\n", in_array, tab[0].flags, myname ? myname : "unknown name");
     360                        if (in_array > 0 && tab[COUNT - 1].id != NULL) //in_array>0 -> completely empty paramtab can't end with the usual zero row because that's also its first row
     361                                printf("\nCHECK_PARAMENTRY_COUNT: last entry is not null (%s)\n\n", myname ? myname : "unknown name");
     362                }
    365363        }
    366364
    367         template<typename T, typename std::enable_if_t<std::is_same<ParamEntry*,T>::value>* = nullptr > //SFINAE-fu because the normal ParamEntry* overload would be also called for ParamEntry[COUNT] argument
     365        template<typename T, typename std::enable_if_t<std::is_same<ParamEntry*, T>::value>* = nullptr > //SFINAE-fu because the normal ParamEntry* overload would be also called for ParamEntry[COUNT] argument
    368366        Param(T t, void* o = 0, const char*n = 0) :SimpleAbstractParam(o, n), tab(t)
    369367        {
    370368                //printf("Param(ParamEntry* t) %s\n",tab?tab[0].name:"");
    371                 if (!n&&tab) myname = tab[0].name;
     369                if (!n && tab) myname = tab[0].name;
    372370        }
    373371
     
    378376
    379377#else // CHECK_PARAMENTRY_COUNT
    380        
    381         Param(ParamEntry *t = 0, void* o = 0, const char*n = 0) :SimpleAbstractParam(o, n), tab(t)
     378
     379        Param(ParamEntry *t = 0, void* o = 0, const char*n = 0) : SimpleAbstractParam(o, n), tab(t)
    382380        {
    383                 if (!n&&tab) myname = tab[0].name;
     381                if (!n && tab) myname = tab[0].name;
    384382        }
    385        
     383
    386384#endif // CHECK_PARAMENTRY_COUNT
    387        
     385
    388386        Param(const Param& p) :SimpleAbstractParam(p.object, p.myname), tab(p.tab) {}
    389387        void operator=(const Param&p) { object = p.object; myname = p.myname; tab = p.tab; }
Note: See TracChangeset for help on using the changeset viewer.