Overview
Comment: | Initial OFValue implementation |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
4a08ae655b5f8a6c7de59b547af83910 |
User & Date: | js on 2018-01-21 00:48:55 |
Other Links: | manifest | tags |
Context
2018-01-21
| ||
01:38 | OFValue: Add support for pointers and objects check-in: 237a4e91a9 user: js tags: trunk | |
00:48 | Initial OFValue implementation check-in: 4a08ae655b user: js tags: trunk | |
2018-01-20
| ||
21:21 | Prevent recursing into directories twice check-in: 5a849ab6c2 user: js tags: trunk | |
Changes
Modified src/Makefile from [c19a18b891] to [56da1c535b].
︙ | ︙ | |||
84 85 86 87 88 89 90 91 92 93 94 95 96 97 | OFTarArchive.m \ OFTarArchiveEntry.m \ OFThread.m \ OFTimer.m \ OFTriple.m \ OFURL.m \ OFURLHandler.m \ OFXMLAttribute.m \ OFXMLCDATA.m \ OFXMLCharacters.m \ OFXMLComment.m \ OFXMLElement.m \ OFXMLElement+Serialization.m \ OFXMLElementBuilder.m \ | > | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | OFTarArchive.m \ OFTarArchiveEntry.m \ OFThread.m \ OFTimer.m \ OFTriple.m \ OFURL.m \ OFURLHandler.m \ OFValue.m \ OFXMLAttribute.m \ OFXMLCDATA.m \ OFXMLCharacters.m \ OFXMLComment.m \ OFXMLElement.m \ OFXMLElement+Serialization.m \ OFXMLElementBuilder.m \ |
︙ | ︙ | |||
166 167 168 169 170 171 172 173 174 175 176 177 178 179 | OFDictionary_hashtable.m \ OFMutableArray_adjacent.m \ OFMutableDictionary_hashtable.m \ OFMutableSet_hashtable.m \ OFMutableString_UTF8.m \ OFSet_hashtable.m \ OFString_UTF8.m \ ${AUTORELEASE_M} \ ${FOUNDATION_COMPAT_M} \ ${INSTANCE_M} SRCS_FILES += OFSettings_INIFile.m \ OFURLHandler_file.m SRCS_SOCKETS += OFKernelEventObserver.m \ ${OFKERNELEVENTOBSERVER_EPOLL_M} \ | > | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | OFDictionary_hashtable.m \ OFMutableArray_adjacent.m \ OFMutableDictionary_hashtable.m \ OFMutableSet_hashtable.m \ OFMutableString_UTF8.m \ OFSet_hashtable.m \ OFString_UTF8.m \ OFValue_bytes.m \ ${AUTORELEASE_M} \ ${FOUNDATION_COMPAT_M} \ ${INSTANCE_M} SRCS_FILES += OFSettings_INIFile.m \ OFURLHandler_file.m SRCS_SOCKETS += OFKernelEventObserver.m \ ${OFKERNELEVENTOBSERVER_EPOLL_M} \ |
︙ | ︙ |
Added src/OFValue.h version [e0eab57137].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFObject.h" OF_ASSUME_NONNULL_BEGIN /*! * @class OFValue OFValue.h ObjFW/OFValue.h * * @brief A class for storing arbitrary values in an object. */ @interface OFValue: OFObject /*! * @brief The ObjC type encoding of the value. */ @property (nonatomic, readonly) const char *objCType; /*! * @brief Creates a new, autorelease OFValue with the specified bytes of the * specified type. * * @param bytes The bytes containing the value * @param objCType The ObjC type encoding for the value * @return A new, autoreleased OFValue */ + (instancetype)valueWithBytes: (const void *)bytes objCType: (const char *)objCType; /*! * @brief Initializes an already allocated OFValue with the specified bytes of * the specified type. * * @param bytes The bytes containing the value * @param objCType The ObjC type encoding for the value * @return An initialized OFValue */ - (instancetype)initWithBytes: (const void *)bytes objCType: (const char *)objCType; /*! * @brief Gets the value. * * If the specified size does not match, this raises an * @ref OFOutOfRangeException. * * @param value The buffer to copy the value into * @param size The size of the value */ - (void)getValue: (void *)value size: (size_t)size; @end OF_ASSUME_NONNULL_END #if !defined(NSINTEGER_DEFINED) && !__has_feature(modules) /* Required for array literals to work */ @compatibility_alias NSValue OFValue; #endif |
Added src/OFValue.m version [a76d433362].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFValue.h" #import "OFValue_bytes.h" #import "OFMethodSignature.h" #import "OFOutOfMemoryException.h" static struct { Class isa; } placeholder; @interface OFValue_placeholder: OFValue @end @implementation OFValue_placeholder - (instancetype)initWithBytes: (const void *)bytes objCType: (const char *)objCType { return (id)[[OFValue_bytes alloc] initWithBytes: bytes objCType: objCType]; } @end @implementation OFValue + (void)initialize { if (self == [OFValue class]) placeholder.isa = [OFValue_placeholder class]; } + (instancetype)alloc { if (self == [OFValue class]) return (id)&placeholder; return [super alloc]; } + (instancetype)valueWithBytes: (const void *)bytes objCType: (const char *)objCType { return [[[self alloc] initWithBytes: bytes objCType: objCType] autorelease]; } - (instancetype)initWithBytes: (const void *)bytes objCType: (const char *)objCType { OF_INVALID_INIT_METHOD } - (bool)isEqual: (id)object { const char *objCType; size_t size; void *buffer, *otherBuffer; if (![object isKindOfClass: [OFValue class]]) return false; objCType = [self objCType]; if (strcmp([object objCType], objCType) != 0) return false; size = of_sizeof_type_encoding(objCType); if ((buffer = malloc(size)) == NULL) @throw [OFOutOfMemoryException exceptionWithRequestedSize: size]; if ((otherBuffer = malloc(size)) == NULL) @throw [OFOutOfMemoryException exceptionWithRequestedSize: size]; @try { [self getValue: buffer size: size]; [object getValue: otherBuffer size: size]; return (memcmp(buffer, otherBuffer, size) == 0); } @finally { free(buffer); free(otherBuffer); } } - (uint32_t)hash { uint32_t hash; size_t size; char *buffer; size = of_sizeof_type_encoding([self objCType]); if ((buffer = malloc(size)) == NULL) @throw [OFOutOfMemoryException exceptionWithRequestedSize: size]; [self getValue: buffer size: size]; @try { OF_HASH_INIT(hash); for (size_t i = 0; i < size; i++) OF_HASH_ADD(hash, buffer[i]); OF_HASH_FINALIZE(hash); } @finally { free(buffer); } return hash; } - (const char *)objCType { OF_UNRECOGNIZED_SELECTOR } - (void)getValue: (void *)value size: (size_t)size { OF_UNRECOGNIZED_SELECTOR } @end |
Added src/OFValue_bytes.h version [bcfee3a6ca].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFValue.h" OF_ASSUME_NONNULL_BEGIN @interface OFValue_bytes: OFValue { size_t _size; void *_bytes; const char *_objCType; } @end OF_ASSUME_NONNULL_END |
Added src/OFValue_bytes.m version [cb31249664].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #import "OFValue_bytes.h" #import "OFMethodSignature.h" #import "OFOutOfRangeException.h" @implementation OFValue_bytes @synthesize objCType = _objCType; - (instancetype)initWithBytes: (const void *)bytes objCType: (const char *)objCType { self = [super init]; @try { _size = of_sizeof_type_encoding(objCType); _objCType = objCType; _bytes = [self allocMemoryWithSize: _size]; memcpy(_bytes, bytes, _size); } @catch (id e) { [self release]; @throw e; } return self; } - (void)getValue: (void *)value size: (size_t)size { if (size != _size) @throw [OFOutOfRangeException exception]; memcpy(value, _bytes, _size); } @end |
Modified src/ObjFW.h from [70a0ca6739] to [3e34a3f2ec].
︙ | ︙ | |||
30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #import "OFDictionary.h" #import "OFMapTable.h" #import "OFSet.h" #import "OFCountedSet.h" #import "OFPair.h" #import "OFTriple.h" #import "OFEnumerator.h" #import "OFNull.h" | > | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #import "OFDictionary.h" #import "OFMapTable.h" #import "OFSet.h" #import "OFCountedSet.h" #import "OFValue.h" #import "OFPair.h" #import "OFTriple.h" #import "OFEnumerator.h" #import "OFNull.h" |
︙ | ︙ |
Modified tests/Makefile from [38df2ce704] to [5e33164e81].
︙ | ︙ | |||
24 25 26 27 28 29 30 31 32 33 34 35 36 37 | OFMethodSignatureTests.m \ OFNumberTests.m \ OFObjectTests.m \ OFSetTests.m \ OFStreamTests.m \ OFStringTests.m \ OFURLTests.m \ OFXMLElementBuilderTests.m \ OFXMLNodeTests.m \ OFXMLParserTests.m \ PBKDF2Tests.m \ RuntimeTests.m \ ScryptTests.m \ TestsAppDelegate.m \ | > | 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | OFMethodSignatureTests.m \ OFNumberTests.m \ OFObjectTests.m \ OFSetTests.m \ OFStreamTests.m \ OFStringTests.m \ OFURLTests.m \ OFValueTests.m \ OFXMLElementBuilderTests.m \ OFXMLNodeTests.m \ OFXMLParserTests.m \ PBKDF2Tests.m \ RuntimeTests.m \ ScryptTests.m \ TestsAppDelegate.m \ |
︙ | ︙ |
Added tests/OFValueTests.m version [c4c56eee46].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | /* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, * 2018 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <string.h> #import "OFValue.h" #import "OFAutoreleasePool.h" #import "OFOutOfRangeException.h" #import "TestsAppDelegate.h" static OFString *module = @"OFValue"; @implementation TestsAppDelegate (OFValueTests) - (void)valueTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; of_range_t range = of_range(1, 64), range2 = of_range(1, 64); OFValue *value; TEST(@"+[valueWithBytes:objCType:]", (value = [OFValue valueWithBytes: &range objCType: @encode(of_range_t)])) TEST(@"-[objCType]", strcmp([value objCType], @encode(of_range_t)) == 0) range = of_range(OF_NOT_FOUND, 0); TEST(@"-[getValue:size:]", R([value getValue: &range size: sizeof(of_range_t)]) && memcmp(&range, &range2, sizeof(of_range_t)) == 0) EXPECT_EXCEPTION(@"-[getValue:size:] with wrong size throws", OFOutOfRangeException, [value getValue: &range size: sizeof(of_range_t) - 1]) [pool drain]; } @end |
Modified tests/TestsAppDelegate.h from [ed99dabb27] to [1db9587198].
︙ | ︙ | |||
216 217 218 219 220 221 222 223 224 225 226 227 228 229 | @interface TestsAppDelegate (OFUDPSocketTests) - (void)UDPSocketTests; @end @interface TestsAppDelegate (OFURLTests) - (void)URLTests; @end @interface TestsAppDelegate (OFXMLElementBuilderTests) - (void)XMLElementBuilderTests; @end @interface TestsAppDelegate (OFXMLNodeTests) - (void)XMLNodeTests; | > > > > | 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 | @interface TestsAppDelegate (OFUDPSocketTests) - (void)UDPSocketTests; @end @interface TestsAppDelegate (OFURLTests) - (void)URLTests; @end @interface TestsAppDelegate (OFValueTests) - (void)valueTests; @end @interface TestsAppDelegate (OFXMLElementBuilderTests) - (void)XMLElementBuilderTests; @end @interface TestsAppDelegate (OFXMLNodeTests) - (void)XMLNodeTests; |
︙ | ︙ |
Modified tests/TestsAppDelegate.m from [67fb65151c] to [3f873c7651].
︙ | ︙ | |||
394 395 396 397 398 399 400 401 402 403 404 405 406 407 | [self characterSetTests]; [self dataTests]; [self arrayTests]; [self dictionaryTests]; [self listTests]; [self setTests]; [self dateTests]; [self numberTests]; [self streamTests]; #ifdef OF_HAVE_FILES [self MD5HashTests]; [self RIPEMD160HashTests]; [self SHA1HashTests]; [self SHA224HashTests]; | > | 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 | [self characterSetTests]; [self dataTests]; [self arrayTests]; [self dictionaryTests]; [self listTests]; [self setTests]; [self dateTests]; [self valueTests]; [self numberTests]; [self streamTests]; #ifdef OF_HAVE_FILES [self MD5HashTests]; [self RIPEMD160HashTests]; [self SHA1HashTests]; [self SHA224HashTests]; |
︙ | ︙ |