RobLoach / raylib-cpp

C++ Object Oriented Wrapper for raylib
https://robloach.github.io/raylib-cpp/
zlib License
630 stars 79 forks source link

Reviewing Getter and Setter #303

Open furudbat opened 7 months ago

furudbat commented 7 months ago

While rewriting the code for my own proposes, I encounter that everything can be get and set, at first this not bad, but doesn't make always sense, for example: all the owning pointers or resources with depending member like width and height in Image. Maybe we can prevent the user from setting depended members or changing pointer to leak memory/ownership. What happens when someone tempers with SetMaterialCount in Model but didn't update Materials.

For example, Image:

    CONST_GETTER(void*, Data, data)
    GETTER(int, Width, width)
    GETTER(int, Height, height)
    GETTER(int, Mipmaps, mipmaps)
    GETTER(int, Format, format)

So the Image can only been loaded or manipulated with operations like Format.

Not sure about something like Texture, is resetting the id ok (?) Only set the id via Load or from ::Texture (?)

There is also the possibility for using something like std::span for arrays.

    /// Model
    GETTERSETTER(int, MeshCount, meshCount)
    GETTERSETTER(int, MaterialCount, materialCount)
    SPAN_GETTER(::Mesh, Meshes, meshes, meshCount)
    SPAN_GETTER(::Material, Materials, materials, materialCount)   ///< std::span{materials, materialCount}

    /// AutomationEventList
    GETTERSETTER(unsigned int, Capacity, capacity)
    GETTERSETTER(unsigned int, Count, count)
    SPAN_GETTER(AutomationEvent, Events, events, capacity)

While the classes still can been converted to (C) raylib structs and "loaded" from raylibs structs, the wrapper interface itself can been a little bit more robust, and if someone really want to tamper with the data, it still can been done via (explicit) casting. or using the public members. (I personally thinking about, using composition for the classes and explicit casting, so the data is no more public)

RobLoach commented 7 months ago

Good ideas. I agree some things should not be actually set