From 01e5043ca41235b0809bf9fa818d4ee08112be5d Mon Sep 17 00:00:00 2001 From: Rob Rix Date: Fri, 6 Jan 2012 21:03:29 -0500 Subject: [PATCH 1/4] Adds -attributeTypeName to attributes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -attributeTypeName uses the “attributeValueTypeName” field in userInfo if available, defaulting to the scalarAttributeType if any, or else the objectAttributeType suffixed with a *. Intended for use in the templates, deprecating both -scalarAttributeType and -objectAttributeType. Use case: transformable attributes with “id” as their type (as opposed to the unidiomatic and frankly weird NSObject *). --- mogenerator.h | 1 + mogenerator.m | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/mogenerator.h b/mogenerator.h index 1860945a..2daf85ba 100644 --- a/mogenerator.h +++ b/mogenerator.h @@ -32,6 +32,7 @@ - (NSString*)scalarAttributeType; - (BOOL)hasDefinedAttributeType; - (NSString*)objectAttributeType; +- (NSString*)attributeTypeName; - (BOOL)hasTransformableAttributeType; @end diff --git a/mogenerator.m b/mogenerator.m index d8213a4a..2ee2bf9f 100644 --- a/mogenerator.m +++ b/mogenerator.m @@ -259,6 +259,12 @@ - (NSString*)objectAttributeType { return [self attributeValueClassName]; } } +- (NSString*)attributeTypeName { + return + [[self userInfo] objectForKey:@"attributeValueTypeName"] + ?: [self scalarAttributeType] + ?: [[self objectAttributeType] stringByAppendingString:@"*"]; +} - (BOOL)hasTransformableAttributeType { return ([self attributeType] == NSTransformableAttributeType); From fd2b5560769cdaa73f08febc35dcad356e8c7634 Mon Sep 17 00:00:00 2001 From: Rob Rix Date: Fri, 6 Jan 2012 21:40:05 -0500 Subject: [PATCH 2/4] Adds scalar int*_t support. This is done by adding -scalarAttributeTypeName, -scalarAccessorMethodName, and -scalarFactoryMethodName to NSAttributeDescription. -scalarAttributeTypeName returns the same thing as -scalarAttributeType, except that where that uses short, int, and long long, the new method uses int16_t, int32_t, and int64_t. To allow simple boxing and unboxing with NSNumber, -scalarAccessorMethodName and -scalarFactoryMethodName return the appropriate values for the scalar type, e.g. boolValue, longLongValue, and numberWithShort:. --- mogenerator.h | 3 +++ mogenerator.m | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/mogenerator.h b/mogenerator.h index 2daf85ba..885607b2 100644 --- a/mogenerator.h +++ b/mogenerator.h @@ -30,6 +30,9 @@ @interface NSAttributeDescription (scalarAttributeType) - (BOOL)hasScalarAttributeType; - (NSString*)scalarAttributeType; +- (NSString*)scalarAttributeTypeName; +- (NSString*)scalarAccessorMethodName; +- (NSString*)scalarFactoryMethodName; - (BOOL)hasDefinedAttributeType; - (NSString*)objectAttributeType; - (NSString*)attributeTypeName; diff --git a/mogenerator.m b/mogenerator.m index 2ee2bf9f..b8c10f69 100644 --- a/mogenerator.m +++ b/mogenerator.m @@ -248,6 +248,78 @@ - (NSString*)scalarAttributeType { return nil; } } +- (NSString*)scalarAttributeTypeName { + switch ([self attributeType]) { + case NSInteger16AttributeType: + return @"int16_t"; + break; + case NSInteger32AttributeType: + return @"int32_t"; + break; + case NSInteger64AttributeType: + return @"int64_t"; + break; + case NSDoubleAttributeType: + return @"double"; + break; + case NSFloatAttributeType: + return @"float"; + break; + case NSBooleanAttributeType: + return @"BOOL"; + break; + default: + return nil; + } +} +- (NSString*)scalarAccessorMethodName { + switch ([self attributeType]) { + case NSInteger16AttributeType: + return @"shortValue"; + break; + case NSInteger32AttributeType: + return @"intValue"; + break; + case NSInteger64AttributeType: + return @"longLongValue"; + break; + case NSDoubleAttributeType: + return @"doubleValue"; + break; + case NSFloatAttributeType: + return @"floatValue"; + break; + case NSBooleanAttributeType: + return @"boolValue"; + break; + default: + return nil; + } +} +- (NSString*)scalarFactoryMethodName { + switch ([self attributeType]) { + case NSInteger16AttributeType: + return @"numberWithShortValue:"; + break; + case NSInteger32AttributeType: + return @"numberWithIntValue:"; + break; + case NSInteger64AttributeType: + return @"numberWithLongLongValue:"; + break; + case NSDoubleAttributeType: + return @"numberWithDoubleValue:"; + break; + case NSFloatAttributeType: + return @"numberWithFloatValue:"; + break; + case NSBooleanAttributeType: + return @"numberWithBoolValue:"; + break; + default: + return nil; + } +} - (BOOL)hasDefinedAttributeType { return [self attributeType] != NSUndefinedAttributeType; } From 161fba55f7b114a4662726a92321a7154b321f65 Mon Sep 17 00:00:00 2001 From: Rob Rix Date: Fri, 6 Jan 2012 22:56:41 -0500 Subject: [PATCH 3/4] The default template uses the new attr methods. Also defaulted to using int*_t for scalars at the same time. --- mogenerator.m | 2 +- templates/machine.h.motemplate | 18 +++++++++--------- templates/machine.m.motemplate | 14 +++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/mogenerator.m b/mogenerator.m index b8c10f69..8ad9ebd5 100644 --- a/mogenerator.m +++ b/mogenerator.m @@ -334,7 +334,7 @@ - (NSString*)objectAttributeType { - (NSString*)attributeTypeName { return [[self userInfo] objectForKey:@"attributeValueTypeName"] - ?: [self scalarAttributeType] + ?: [self scalarAttributeTypeName] ?: [[self objectAttributeType] stringByAppendingString:@"*"]; } diff --git a/templates/machine.h.motemplate b/templates/machine.h.motemplate index 7c0b8e79..fe093369 100644 --- a/templates/machine.h.motemplate +++ b/templates/machine.h.motemplate @@ -32,14 +32,14 @@ extern const struct <$managedObjectClassName$>FetchedProperties {<$foreach Fetch <$foreach Attribute noninheritedAttributes do$> <$if Attribute.hasDefinedAttributeType$> <$if TemplateVar.arc$> -@property (nonatomic, strong) <$Attribute.objectAttributeType$> *<$Attribute.name$>; +@property (nonatomic, strong) <$Attribute.attributeTypeName$> <$Attribute.name$>; <$else$> -@property (nonatomic, retain) <$Attribute.objectAttributeType$> *<$Attribute.name$>; +@property (nonatomic, retain) <$Attribute.attributeTypeName$> <$Attribute.name$>; <$endif$> <$if Attribute.hasScalarAttributeType$> -@property <$Attribute.scalarAttributeType$> <$Attribute.name$>Value; -- (<$Attribute.scalarAttributeType$>)<$Attribute.name$>Value; -- (void)set<$Attribute.name.initialCapitalString$>Value:(<$Attribute.scalarAttributeType$>)value_; +@property <$Attribute.attributeTypeName$> <$Attribute.name$>Value; +- (<$Attribute.attributeTypeName$>)<$Attribute.name$>Value; +- (void)set<$Attribute.name.initialCapitalString$>Value:(<$Attribute.attributeTypeName$>)value_; <$endif$> //- (BOOL)validate<$Attribute.name.initialCapitalString$>:(id*)value_ error:(NSError**)error_; <$endif$> @@ -87,11 +87,11 @@ extern const struct <$managedObjectClassName$>FetchedProperties {<$foreach Fetch @interface _<$managedObjectClassName$> (CoreDataGeneratedPrimitiveAccessors) <$foreach Attribute noninheritedAttributes do$> <$if Attribute.hasDefinedAttributeType$> -- (<$Attribute.objectAttributeType$>*)primitive<$Attribute.name.initialCapitalString$>; -- (void)setPrimitive<$Attribute.name.initialCapitalString$>:(<$Attribute.objectAttributeType$>*)value; +- (<$Attribute.attributeTypeName$>)primitive<$Attribute.name.initialCapitalString$>; +- (void)setPrimitive<$Attribute.name.initialCapitalString$>:(<$Attribute.attributeTypeName$>)value; <$if Attribute.hasScalarAttributeType$> -- (<$Attribute.scalarAttributeType$>)primitive<$Attribute.name.initialCapitalString$>Value; -- (void)setPrimitive<$Attribute.name.initialCapitalString$>Value:(<$Attribute.scalarAttributeType$>)value_; +- (<$Attribute.attributeTypeName$>)primitive<$Attribute.name.initialCapitalString$>Value; +- (void)setPrimitive<$Attribute.name.initialCapitalString$>Value:(<$Attribute.attributeTypeName$>)value_; <$endif$> <$endif$> <$endforeach do$> diff --git a/templates/machine.m.motemplate b/templates/machine.m.motemplate index edc9a676..19e932e5 100644 --- a/templates/machine.m.motemplate +++ b/templates/machine.m.motemplate @@ -56,22 +56,22 @@ const struct <$managedObjectClassName$>FetchedProperties <$managedObjectClassNam <$if Attribute.hasScalarAttributeType$> -- (<$Attribute.scalarAttributeType$>)<$Attribute.name$>Value { +- (<$Attribute.attributeTypeName$>)<$Attribute.name$>Value { NSNumber *result = [self <$Attribute.name$>]; - return [result <$Attribute.scalarAttributeType.camelCaseString$>Value]; + return [result <$Attribute.scalarAttributeAccessorMethod$>]; } -- (void)set<$Attribute.name.initialCapitalString$>Value:(<$Attribute.scalarAttributeType$>)value_ { - [self set<$Attribute.name.initialCapitalString$>:[NSNumber numberWith<$Attribute.scalarAttributeType.camelCaseString.initialCapitalString$>:value_]]; +- (void)set<$Attribute.name.initialCapitalString$>Value:(<$Attribute.attributeTypeName$>)value_ { + [self set<$Attribute.name.initialCapitalString$>:[NSNumber <$Attribute.scalarAttributeFactoryMethod$>value_]]; } -- (<$Attribute.scalarAttributeType$>)primitive<$Attribute.name.initialCapitalString$>Value { +- (<$Attribute.attributeTypeName$>)primitive<$Attribute.name.initialCapitalString$>Value { NSNumber *result = [self primitive<$Attribute.name.initialCapitalString$>]; - return [result <$Attribute.scalarAttributeType.camelCaseString$>Value]; + return [result <$Attribute.scalarAttributeAccessorMethod$>]; } - (void)setPrimitive<$Attribute.name.initialCapitalString$>Value:(<$Attribute.scalarAttributeType$>)value_ { - [self setPrimitive<$Attribute.name.initialCapitalString$>:[NSNumber numberWith<$Attribute.scalarAttributeType.camelCaseString.initialCapitalString$>:value_]]; + [self setPrimitive<$Attribute.name.initialCapitalString$>:[NSNumber <$Attribute.scalarAttributeFactoryMethod$>value_]]; } <$endif$> <$endif$> From 3f8512bd30d7d47a0c7c23796aa9afc386330e81 Mon Sep 17 00:00:00 2001 From: Rob Rix Date: Fri, 6 Jan 2012 23:10:03 -0500 Subject: [PATCH 4/4] Uses the correct keys for the NSNumber messages. --- templates/machine.m.motemplate | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/machine.m.motemplate b/templates/machine.m.motemplate index 19e932e5..6f109876 100644 --- a/templates/machine.m.motemplate +++ b/templates/machine.m.motemplate @@ -58,20 +58,20 @@ const struct <$managedObjectClassName$>FetchedProperties <$managedObjectClassNam - (<$Attribute.attributeTypeName$>)<$Attribute.name$>Value { NSNumber *result = [self <$Attribute.name$>]; - return [result <$Attribute.scalarAttributeAccessorMethod$>]; + return [result <$Attribute.scalarAccessorMethodName$>]; } - (void)set<$Attribute.name.initialCapitalString$>Value:(<$Attribute.attributeTypeName$>)value_ { - [self set<$Attribute.name.initialCapitalString$>:[NSNumber <$Attribute.scalarAttributeFactoryMethod$>value_]]; + [self set<$Attribute.name.initialCapitalString$>:[NSNumber <$Attribute.scalarFactoryMethodName$>value_]]; } - (<$Attribute.attributeTypeName$>)primitive<$Attribute.name.initialCapitalString$>Value { NSNumber *result = [self primitive<$Attribute.name.initialCapitalString$>]; - return [result <$Attribute.scalarAttributeAccessorMethod$>]; + return [result <$Attribute.scalarAccessorMethodName$>]; } - (void)setPrimitive<$Attribute.name.initialCapitalString$>Value:(<$Attribute.scalarAttributeType$>)value_ { - [self setPrimitive<$Attribute.name.initialCapitalString$>:[NSNumber <$Attribute.scalarAttributeFactoryMethod$>value_]]; + [self setPrimitive<$Attribute.name.initialCapitalString$>:[NSNumber <$Attribute.scalarFactoryMethodName$>value_]]; } <$endif$> <$endif$>