Created
December 29, 2019 14:57
-
-
Save gsrunion/a77f31396544b059441945761f90baf5 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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)); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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