/*!
  @header FTReferenceImpl
  @abstract Module of FT
 
  @availability OS X, GNUstep
  @copyright 2004, 2005, 2006 Free Software Foundation, Inc.
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.

  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.

  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA

  <pre>
  -------------------------------------------------------------------------
  Modification history

  30.08.05 ola     initial version
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  </pre>
*/

#include <Encore/Encore.h>
#include <FT/FTReferenceImpl.h>

@implementation FTReferenceImpl
- initWithNodeId: (id <FTId>) aNodeId edgeId: (id <FTId>) anEdgeId {
  self = [super init];

  if( nil == aNodeId || nil == anEdgeId ) {
    [[[ECIllegalArgumentException alloc] 
      initWithArgumentInfo: @"FTReferenceImpl::initWithNodeId: Either nodeId "\
      "nor edgeId may equal nil!"] raise]; 
  }
    
  self->nodeId = [aNodeId retain];
  self->edgeId = [anEdgeId retain];
  
  return self;
}


- (void) dealloc {
  [self->nodeId release];
  [self->edgeId release];
  
  [super dealloc];
}


/* Method used for comparison: */
- (BOOL) isEqual: (id) anObject {
  BOOL to_return = NO;
  
  if( nil != anObject ) {
    if( [anObject isKindOfClass: [self class]] ) {
      if( [self->nodeId isEqual: [anObject nodeId]] ) {
        to_return = [self->edgeId isEqual: [anObject edgeId]];
      }
    }
  }
  
  return to_return;
}


- (unsigned) hash {
  unsigned to_return;
  NSString *hashStr = [[NSString alloc] 
    initWithFormat: @"%u%u", [self->nodeId hash], [self->edgeId hash]];

  to_return = [hashStr hash];
  
  [hashStr release];
  
  return to_return;
  
}


/* NSCoding protocol: */
- (id) initWithCoder: (NSCoder *) decoder {
  self->nodeId = nil;
  self->edgeId = nil;
  
  NS_DURING
    self->nodeId = [[decoder decodeObject] retain];
    self->edgeId = [[decoder decodeObject] retain];    
  NS_HANDLER
    if( nil != self->nodeId ) {
      [self->nodeId release];
    }
    
    if( nil != self->edgeId ) {
      [self->edgeId release];
    }
    
    [localException raise];
  NS_ENDHANDLER
  
  return self;
}


- (NSString *) description {
  return [[NSString alloc] initWithFormat: @"{FTReferenceImpl, nodeId=%@, "\
    "edgeId=%@}", [self->nodeId description], [self->edgeId description]];
}


- (void) encodeWithCoder: (NSCoder *) encoder {
  [encoder encodeObject: self->nodeId];
  [encoder encodeObject: self->edgeId];
}


- (id <FTId>) nodeId {
  return self->nodeId;
}


- (id <FTId>) edgeId {
  return self->edgeId;
}

@end
