// 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=