Skip to content

Instantly share code, notes, and snippets.

@gsrunion
Created December 29, 2019 14:57
Show Gist options
  • Save gsrunion/a77f31396544b059441945761f90baf5 to your computer and use it in GitHub Desktop.
Save gsrunion/a77f31396544b059441945761f90baf5 to your computer and use it in GitHub Desktop.
#include "TaggedPointer.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct Header {
const void* tag;
} Header;
Header* base(void *tagged) {
return tagged - sizeof(Header);
}
void* payload(void* this) {
return this + sizeof(Header);
}
const void* const TaggedPointer_GetTag(void *tagged) {
if(tagged && base(tagged)) {
return base(tagged)->tag;
}
return NULL;
}
void* TaggedPointer_Create(size_t size, const void* const tag) {
if(tag) {
Header *this = calloc(1, sizeof(Header) + size);
this->tag = tag;
return payload(this);
}
return NULL;
}
void TaggedPointer_Destroy(void* tagged) {
free(base(tagged));
}
#ifndef UNTITLED_TAGGEDPOINTER_H
#define UNTITLED_TAGGEDPOINTER_H
#include <stdlib.h>
const void* const TaggedPointer_GetTag(void* tagged);
void* TaggedPointer_Create(size_t size, const void* const tag);
void TaggedPointer_Destroy(void* tagged);
#endif
#include "TaggedPointer.h"
#include <stdlib.h>
#include <stdio.h>
typedef struct Header {
const void* tag;
} Header;
Header* base(void *tagged) {
return tagged - sizeof(Header);
}
void* payload(void* this) {
return this + sizeof(Header);
}
const void* const TaggedPointer_GetTag(void *tagged) {
if(tagged && base(tagged)) {
return base(tagged)->tag;
}
return NULL;
}
void* TaggedPointer_Create(size_t size, const void* const tag) {
if(tag) {
Header *this = calloc(1, sizeof(Header) + size);
this->tag = tag;
return payload(this);
}
return NULL;
}
void TaggedPointer_Destroy(void* tagged) {
free(base(tagged));
}
#ifndef UNTITLED_TAGGEDPOINTER_H
#define UNTITLED_TAGGEDPOINTER_H
#include <stdlib.h>
const void* const TaggedPointer_GetTag(void* tagged);
void* TaggedPointer_Create(size_t size, const void* const tag);
void TaggedPointer_Destroy(void* tagged);
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment