Plooc integration
Use when integrating, refactoring, or debugging PLOOC object-oriented C - def_class encapsulation, private_member protection, vtable dispatch, or inheritance-style structsFrom its SKILL.md
npx -y skills add easyzoom/aix-skills --skill plooc-integrationAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 24 stars24 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
5.6 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it
PLOOC Integration
Overview
Use this skill when PLOOC (Protected Low-overhead Object-Oriented Programming with ANSI-C, by GorgonMeducer) is used to structure embedded C code. PLOOC mimics classes with masked structures: outside the class .c file, private_member/protected_member regions appear as an opaque byte array, so the real work is getting the per-file __<NAME>_CLASS_IMPLEMENT/__<NAME>_CLASS_INHERIT__ guards, member visibility, and vtable/interface dispatch correct. Apply it only where object-style boundaries reduce real complexity.
When To Use
Use this skill when:
- The user mentions PLOOC,
def_class/end_def_class,private_member/protected_member/public_member,implement()-style inheritance, or vtable-based dispatch (def_interface) in embedded C. - A legacy driver/module is being wrapped into an encapsulated class with
plooc_class.h. - The issue involves the masked-struct layout, the
__..._CLASS_IMPLEMENTguard,__OOC_DEBUG__, initialization order, object lifetime, or callback/vtable dispatch.
Do not use this skill for simple drivers where plain C structs and functions are clearer.
First Questions
Ask for:
- PLOOC version (
private_method()/protected_method()/public_method()were added in v4.6.4) and target compiler. - C standard: PLOOC needs ANSI-C99; C90 requires
__OOC_DEBUG__(private-member protection is disabled in that mode); overload/_Genericfeatures need C11. - Which template is selected:
__PLOOC_CLASS_USE_STRICT_TEMPLATE__(strict), simple, simple_c90, or black_box. - Module being refactored and whether it uses single or multiple inheritance (
implement()). - Memory policy: static objects vs
__new_class()/__free_class()/__plooc_malloc_align().
Integration Checklist
-
Set up the header guard pattern. In the class header, map the module macro to the framework macro before including
plooc_class.h, e.g.#if defined(__BYTE_QUEUE_CLASS_IMPLEMENT) # define __PLOOC_CLASS_IMPLEMENT__ #elif defined(__BYTE_QUEUE_CLASS_INHERIT__) # define __PLOOC_CLASS_INHERIT__ #endif. -
Declare then define the class. Use
dcl_class(foo_t)/declare_class(foo_t)(expands totypedef struct foo_t foo_t;), thendef_class(foo_t, ...)...end_def_class(foo_t). Group members withpublic_member(...),protected_member(...),private_member(...)(any order allowed). -
Define the implement macro in exactly one
.cfile. The class.cdoes#define __BYTE_QUEUE_CLASS_IMPLEMENTbefore#include "./byte_queue.h", so only that file sees real private members; every other translation unit sees the masked byte array. -
Access
thisinside methods correctly. Useclass_internal(ptObj, ptThis, foo_t)to obtain the typedptThis, and the#define this (*ptThis)convention for member access. Mark unused args withPLOOC_UNUSED_PARAM. -
Handle inheritance explicitly. Embed a base with
implement(base_t)in the deriveddef_class; the framework generates ause_as__<base>member for the embedded base. Define__<NAME>_CLASS_INHERIT__in a consumer that only needs to read the base's protected members. Access base functionality by passing the address of theuse_as__<base>member to the base-class functions. -
Keep dispatch inspectable. Define vtables with
def_interface(i_foo_t)...end_def_interface(i_foo_t)and a single const interface instance; verify each function pointer is assigned.
Common Failures
- Forgetting
#define __<NAME>_CLASS_IMPLEMENTin the class.c, so the implementation only sees the opaque mask and member access fails to compile. - Defining the implement macro in more than one file, breaking encapsulation.
- Mismatched template selection: header uses
__PLOOC_CLASS_USE_STRICT_TEMPLATE__but a consumer includes with a different template, corrupting struct layout. - C90 or non-C99 toolchain without
__OOC_DEBUG__, so masked structs do not size correctly. implement(base_t)omitted, so nouse_as__<base>member is generated and base-class functions cannot be reached from the derived object.- Private members invisible in the debugger because
__OOC_DEBUG__is not defined for the debug build. - Missing include order:
plooc.h/plooc_class.h(and<stdlib.h>for__new_class) not reachable on the include path.
Verification
Before claiming PLOOC integration works:
- State the PLOOC version, C standard, and which class template (
strict/simple/black_box) is used. - Confirm the header maps
__<NAME>_CLASS_IMPLEMENT/__<NAME>_CLASS_INHERIT__before includingplooc_class.h, and the implement macro is defined in exactly one.c. - Confirm
sizeof(foo_t)is identical inside and outside the implementing file (mask size matches real struct). - Confirm methods resolve
thisviaclass_internal(...)and every vtable pointer in thedef_interfaceinstance is set. - Confirm private members are visible in GDB with
__OOC_DEBUG__in the debug build, and old behavior is preserved for the migrated module.
Example
User:
想用 PLOOC 重构几个传感器驱动。
Agent:
- Asks the PLOOC version, C standard, and whether the sensors share a base class needing
implement(). - Migrates one sensor family:
dcl_class/def_classwithprivate_member/public_member, sets__<NAME>_CLASS_IMPLEMENTin one.c, exposes ops viadef_interface. - Verifies
sizeofmask consistency, vtable wiring, and that private members are inspectable under__OOC_DEBUG__.
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.