#include #include #include #include #include #include #include @implementation PXString /* init/lifecycle */ + (instancetype)stringWithCString:(const char *)cstring { PXString *string = [PXString alloc]; return [string initWithCString:cstring]; } - (instancetype)init { return [self initWithCString:""]; } - (instancetype)initWithCString:(const char *)cstring { self = [super init]; if (self) { if (cstring == NULL) cstring = ""; size_t length = strlen(cstring); flags = 0; // ASCII flags |= PXStringFlagOwned; // OUR string (not compiler's) len = (uint32_t)length; size = (uint32_t)length; hash = 0; // implement hashes later _bytes = malloc(length + 1); memcpy((char *)_bytes, cstring, length + 1); } return self; } - (void)dealloc { if (flags & PXStringFlagOwned) free((void *)_bytes); [super dealloc]; } /* getters */ - (const char *)UTF8String { return _bytes; } - (uint32_t)length { return len; } - (BOOL)isEqual:(PXString *)string { if (self == string) return YES; if (string == nil || len != string->len) return NO; return (memcmp(_bytes, string->_bytes, size) == 0); } @end