Skip to content

Commit

Permalink
KissXML now recycles existing DDXML wrapper nodes. This means faster …
Browse files Browse the repository at this point in the history
…operation if your code accesses the same element over and over again.
  • Loading branch information
robbiehanson committed May 18, 2009
1 parent b54de0e commit 63cb57b
Show file tree
Hide file tree
Showing 7 changed files with 680 additions and 391 deletions.
31 changes: 27 additions & 4 deletions DDXMLDocument.m
Expand Up @@ -7,18 +7,41 @@ @implementation DDXMLDocument

+ (id)nodeWithPrimitive:(xmlKindPtr)nodePtr
{
return [[[DDXMLDocument alloc] initWithPrimitive:nodePtr] autorelease];
if(nodePtr == NULL || nodePtr->type != XML_DOCUMENT_NODE)
{
return nil;
}

xmlDocPtr doc = (xmlDocPtr)nodePtr;
if(doc->_private == NULL)
return [[[DDXMLDocument alloc] initWithCheckedPrimitive:nodePtr] autorelease];
else
return [[((DDXMLDocument *)(doc->_private)) retain] autorelease];
}

- (id)initWithPrimitive:(xmlKindPtr)nodePtr
- (id)initWithUncheckedPrimitive:(xmlKindPtr)nodePtr
{
if(nodePtr == NULL || nodePtr->type != XML_DOCUMENT_NODE)
{
[self release];
return nil;
}

self = [super initWithPrimitive:nodePtr];
xmlDocPtr doc = (xmlDocPtr)nodePtr;
if(doc->_private == NULL)
{
return [self initWithCheckedPrimitive:nodePtr];
}
else
{
[self release];
return [((DDXMLDocument *)(doc->_private)) retain];
}
}

- (id)initWithCheckedPrimitive:(xmlKindPtr)nodePtr
{
self = [super initWithCheckedPrimitive:nodePtr];
return self;
}

Expand Down Expand Up @@ -65,7 +88,7 @@ - (id)initWithData:(NSData *)data options:(NSUInteger)mask error:(NSError **)err
return nil;
}

return [self initWithPrimitive:(xmlKindPtr)doc];
return [self initWithCheckedPrimitive:(xmlKindPtr)doc];
}

/**
Expand Down
70 changes: 50 additions & 20 deletions DDXMLElement.m
Expand Up @@ -10,17 +10,27 @@ - (id)initWithName:(NSString *)name
// Note: Make every guarantee that genericPtr is not null

xmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);
if(node == NULL)
{
[self release];
return nil;
}

return [self initWithPrimitive:(xmlKindPtr)node];
return [self initWithCheckedPrimitive:(xmlKindPtr)node];
}

- (id)initWithName:(NSString *)name URI:(NSString *)URI
{
// Note: Make every guarantee that genericPtr is not null

xmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);
if(node == NULL)
{
[self release];
return nil;
}

id result = [self initWithPrimitive:(xmlKindPtr)node];
DDXMLElement *result = [self initWithCheckedPrimitive:(xmlKindPtr)node];
[result setURI:URI];

return result;
Expand All @@ -31,8 +41,13 @@ - (id)initWithName:(NSString *)name stringValue:(NSString *)string
// Note: Make every guarantee that genericPtr is not null

xmlNodePtr node = xmlNewNode(NULL, [name xmlChar]);
if(node == NULL)
{
[self release];
return nil;
}

id result = [self initWithPrimitive:(xmlKindPtr)node];
DDXMLElement *result = [self initWithCheckedPrimitive:(xmlKindPtr)node];
[result setStringValue:string];

return result;
Expand All @@ -41,33 +56,57 @@ - (id)initWithName:(NSString *)name stringValue:(NSString *)string
- (id)initWithXMLString:(NSString *)string error:(NSError **)error
{
DDXMLDocument *doc = [[DDXMLDocument alloc] initWithXMLString:string options:0 error:error];

if(doc == nil)
{
[self release];
return nil;
}

DDXMLNode *result = [doc rootElement];
DDXMLElement *result = [doc rootElement];
[result detach];
[doc release];

[self release];
return [result retain];
}

+ (id)nodeWithPrimitive:(xmlKindPtr)nodePtr
{
return [[[DDXMLElement alloc] initWithPrimitive:nodePtr] autorelease];
if(nodePtr == NULL || nodePtr->type != XML_ELEMENT_NODE)
{
return nil;
}

xmlNodePtr node = (xmlNodePtr)nodePtr;
if(node->_private == NULL)
return [[[DDXMLElement alloc] initWithCheckedPrimitive:nodePtr] autorelease];
else
return [[((DDXMLElement *)(node->_private)) retain] autorelease];
}

- (id)initWithPrimitive:(xmlKindPtr)nodePtr
- (id)initWithUncheckedPrimitive:(xmlKindPtr)nodePtr
{
if(nodePtr == NULL || nodePtr->type != XML_ELEMENT_NODE)
{
[self release];
return nil;
}

self = [super initWithPrimitive:nodePtr];
xmlNodePtr node = (xmlNodePtr)nodePtr;
if(node->_private == NULL)
{
return [self initWithCheckedPrimitive:nodePtr];
}
else
{
[self release];
return [((DDXMLElement *)(node->_private)) retain];
}
}

- (id)initWithCheckedPrimitive:(xmlKindPtr)nodePtr
{
self = [super initWithCheckedPrimitive:nodePtr];
return self;
}

Expand Down Expand Up @@ -174,10 +213,7 @@ - (NSArray *)elementsWithName:(NSString *)name uri:(NSString *)uri

if(match)
{
DDXMLElement *childElement = [[DDXMLElement alloc] initWithPrimitive:(xmlKindPtr)child];

[result addObject:childElement];
[childElement release];
[result addObject:[DDXMLElement nodeWithPrimitive:(xmlKindPtr)child]];
}
}

Expand Down Expand Up @@ -241,10 +277,7 @@ - (NSArray *)attributes
xmlAttrPtr attr = ((xmlNodePtr)genericPtr)->properties;
while(attr != NULL)
{
DDXMLNode *attrNode = [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)attr];

[result addObject:attrNode];
[attrNode release];
[result addObject:[DDXMLNode nodeWithPrimitive:(xmlKindPtr)attr]];

attr = attr->next;
}
Expand Down Expand Up @@ -362,10 +395,7 @@ - (NSArray *)namespaces
xmlNsPtr ns = ((xmlNodePtr)genericPtr)->nsDef;
while(ns != NULL)
{
DDXMLNode *nsNode = [[DDXMLNode alloc] initWithPrimitive:(xmlKindPtr)ns nsParent:(xmlNodePtr)genericPtr];

[result addObject:nsNode];
[nsNode release];
[result addObject:[DDXMLNode nodeWithPrimitive:(xmlKindPtr)ns nsParent:(xmlNodePtr)genericPtr]];

ns = ns->next;
}
Expand Down

0 comments on commit 63cb57b

Please sign in to comment.