// singleton.h
typedef int (*GetterFunc)(void);
typedef void (*SetterFunc)(int);
typedef struct
{
GetterFunc GetFoo;
GetterFunc GetBar;
SetterFunc SetFoo;
SetterFunc SetBar;
} Singleton;
Singleton* GetSingleton();
// singleton.c
#include <stdbool.h>
static int foo;
static int bar;
static int GetFooImpl()
{
return foo;
}
static int GetBarImpl()
{
return bar;
}
static void SetFooImpl(int value)
{
foo = value;
}
static void SetBarImpl(int value)
{
bar = value;
}
Singleton* GetSingleton()
{
static bool isInitialized;
static Singleton instance;
if (!isInitialized)
{
instance.GetFoo = &GetFooImpl;
instance.GetBar = &GetBarImpl;
instance.SetFoo = &SetFooImpl;
instance.SetBar = &SetBarImpl;
isInitialized = true;
}
return &instance;
}
// test.c
#include <stdio.h>
int main(void)
{
int myFoo, myBar;
Singleton* instance = GetSingleton();
instance->SetFoo(1);
instance->SetBar(2);
myFoo = instance->GetFoo();
myBar = instance->GetBar();
printf("foo=%d, bar=%d", myFoo
, myBar
); }
Ly8gc2luZ2xldG9uLmgKCnR5cGVkZWYgaW50ICgqR2V0dGVyRnVuYykodm9pZCk7CnR5cGVkZWYgdm9pZCAoKlNldHRlckZ1bmMpKGludCk7Cgp0eXBlZGVmIHN0cnVjdAp7CglHZXR0ZXJGdW5jIEdldEZvbzsKCUdldHRlckZ1bmMgR2V0QmFyOwoJU2V0dGVyRnVuYyBTZXRGb287CglTZXR0ZXJGdW5jIFNldEJhcjsKfSBTaW5nbGV0b247CgpTaW5nbGV0b24qIEdldFNpbmdsZXRvbigpOwoKLy8gc2luZ2xldG9uLmMKCiNpbmNsdWRlIDxzdGRib29sLmg+CgpzdGF0aWMgaW50IGZvbzsKc3RhdGljIGludCBiYXI7CgpzdGF0aWMgaW50IEdldEZvb0ltcGwoKQp7CglyZXR1cm4gZm9vOwp9CgpzdGF0aWMgaW50IEdldEJhckltcGwoKQp7CglyZXR1cm4gYmFyOwp9CgpzdGF0aWMgdm9pZCBTZXRGb29JbXBsKGludCB2YWx1ZSkKewoJZm9vID0gdmFsdWU7Cn0KCnN0YXRpYyB2b2lkIFNldEJhckltcGwoaW50IHZhbHVlKQp7CgliYXIgPSB2YWx1ZTsKfQoKU2luZ2xldG9uKiBHZXRTaW5nbGV0b24oKQp7CglzdGF0aWMgYm9vbCBpc0luaXRpYWxpemVkOwoJc3RhdGljIFNpbmdsZXRvbiBpbnN0YW5jZTsKCQoJaWYgKCFpc0luaXRpYWxpemVkKQoJewoJCWluc3RhbmNlLkdldEZvbyA9ICZHZXRGb29JbXBsOwoJCWluc3RhbmNlLkdldEJhciA9ICZHZXRCYXJJbXBsOwoJCWluc3RhbmNlLlNldEZvbyA9ICZTZXRGb29JbXBsOwoJCWluc3RhbmNlLlNldEJhciA9ICZTZXRCYXJJbXBsOwoJCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwoJfQoJCgkgcmV0dXJuICZpbnN0YW5jZTsKfQoKLy8gdGVzdC5jCgojaW5jbHVkZSA8c3RkaW8uaD4KCmludCBtYWluKHZvaWQpCnsKCWludCBteUZvbywgbXlCYXI7CgkKCVNpbmdsZXRvbiogaW5zdGFuY2UgPSBHZXRTaW5nbGV0b24oKTsKCWluc3RhbmNlLT5TZXRGb28oMSk7CglpbnN0YW5jZS0+U2V0QmFyKDIpOwoJCglteUZvbyA9IGluc3RhbmNlLT5HZXRGb28oKTsKCW15QmFyID0gaW5zdGFuY2UtPkdldEJhcigpOwoJCglwcmludGYoImZvbz0lZCwgYmFyPSVkIiwgbXlGb28sIG15QmFyKTsKfQo=