// Generated by the protocol buffer compiler.  DO NOT EDIT!

#import "Software_profile.pb.h"
// @@protoc_insertion_point(imports)

@implementation SoftwareProfileRoot
static PBExtensionRegistry* extensionRegistry = nil;
+ (PBExtensionRegistry*) extensionRegistry {
  return extensionRegistry;
}

+ (void) initialize {
  if (self == [SoftwareProfileRoot class]) {
    PBMutableExtensionRegistry* registry = [PBMutableExtensionRegistry registry];
    [self registerAllExtensions:registry];
    extensionRegistry = registry;
  }
}
+ (void) registerAllExtensions:(PBMutableExtensionRegistry*) registry {
}
@end

@interface SoftwareProfile ()
@property (strong) NSString* version;
@property SInt64 updateTime;
@property (strong) NSString* description;
@end

@implementation SoftwareProfile

- (BOOL) hasVersion {
  return !!hasVersion_;
}
- (void) setHasVersion:(BOOL) value_ {
  hasVersion_ = !!value_;
}
@synthesize version;
- (BOOL) hasUpdateTime {
  return !!hasUpdateTime_;
}
- (void) setHasUpdateTime:(BOOL) value_ {
  hasUpdateTime_ = !!value_;
}
@synthesize updateTime;
- (BOOL) hasDescription {
  return !!hasDescription_;
}
- (void) setHasDescription:(BOOL) value_ {
  hasDescription_ = !!value_;
}
@synthesize description;
- (id) init {
  if ((self = [super init])) {
    self.version = @"";
    self.updateTime = 0L;
    self.description = @"";
  }
  return self;
}
static SoftwareProfile* defaultSoftwareProfileInstance = nil;
+ (void) initialize {
  if (self == [SoftwareProfile class]) {
    defaultSoftwareProfileInstance = [[SoftwareProfile alloc] init];
  }
}
+ (SoftwareProfile*) defaultInstance {
  return defaultSoftwareProfileInstance;
}
- (SoftwareProfile*) defaultInstance {
  return defaultSoftwareProfileInstance;
}
- (BOOL) isInitialized {
  return YES;
}
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output {
  if (self.hasVersion) {
    [output writeString:1 value:self.version];
  }
  if (self.hasUpdateTime) {
    [output writeInt64:2 value:self.updateTime];
  }
  if (self.hasDescription) {
    [output writeString:3 value:self.description];
  }
  [self.unknownFields writeToCodedOutputStream:output];
}
- (SInt32) serializedSize {
  __block SInt32 size_ = memoizedSerializedSize;
  if (size_ != -1) {
    return size_;
  }

  size_ = 0;
  if (self.hasVersion) {
    size_ += computeStringSize(1, self.version);
  }
  if (self.hasUpdateTime) {
    size_ += computeInt64Size(2, self.updateTime);
  }
  if (self.hasDescription) {
    size_ += computeStringSize(3, self.description);
  }
  size_ += self.unknownFields.serializedSize;
  memoizedSerializedSize = size_;
  return size_;
}
+ (SoftwareProfile*) parseFromData:(NSData*) data {
  return (SoftwareProfile*)[[[SoftwareProfile builder] mergeFromData:data] build];
}
+ (SoftwareProfile*) parseFromData:(NSData*) data extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (SoftwareProfile*)[[[SoftwareProfile builder] mergeFromData:data extensionRegistry:extensionRegistry] build];
}
+ (SoftwareProfile*) parseFromInputStream:(NSInputStream*) input {
  return (SoftwareProfile*)[[[SoftwareProfile builder] mergeFromInputStream:input] build];
}
+ (SoftwareProfile*) parseFromInputStream:(NSInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (SoftwareProfile*)[[[SoftwareProfile builder] mergeFromInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (SoftwareProfile*) parseFromCodedInputStream:(PBCodedInputStream*) input {
  return (SoftwareProfile*)[[[SoftwareProfile builder] mergeFromCodedInputStream:input] build];
}
+ (SoftwareProfile*) parseFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  return (SoftwareProfile*)[[[SoftwareProfile builder] mergeFromCodedInputStream:input extensionRegistry:extensionRegistry] build];
}
+ (SoftwareProfileBuilder*) builder {
  return [[SoftwareProfileBuilder alloc] init];
}
+ (SoftwareProfileBuilder*) builderWithPrototype:(SoftwareProfile*) prototype {
  return [[SoftwareProfile builder] mergeFrom:prototype];
}
- (SoftwareProfileBuilder*) builder {
  return [SoftwareProfile builder];
}
- (SoftwareProfileBuilder*) toBuilder {
  return [SoftwareProfile builderWithPrototype:self];
}
- (void) writeDescriptionTo:(NSMutableString*) output withIndent:(NSString*) indent {
  if (self.hasVersion) {
    [output appendFormat:@"%@%@: %@\n", indent, @"version", self.version];
  }
  if (self.hasUpdateTime) {
    [output appendFormat:@"%@%@: %@\n", indent, @"updateTime", [NSNumber numberWithLongLong:self.updateTime]];
  }
  if (self.hasDescription) {
    [output appendFormat:@"%@%@: %@\n", indent, @"description", self.description];
  }
  [self.unknownFields writeDescriptionTo:output withIndent:indent];
}
- (BOOL) isEqual:(id)other {
  if (other == self) {
    return YES;
  }
  if (![other isKindOfClass:[SoftwareProfile class]]) {
    return NO;
  }
  SoftwareProfile *otherMessage = other;
  return
      self.hasVersion == otherMessage.hasVersion &&
      (!self.hasVersion || [self.version isEqual:otherMessage.version]) &&
      self.hasUpdateTime == otherMessage.hasUpdateTime &&
      (!self.hasUpdateTime || self.updateTime == otherMessage.updateTime) &&
      self.hasDescription == otherMessage.hasDescription &&
      (!self.hasDescription || [self.description isEqual:otherMessage.description]) &&
      (self.unknownFields == otherMessage.unknownFields || (self.unknownFields != nil && [self.unknownFields isEqual:otherMessage.unknownFields]));
}
- (NSUInteger) hash {
  __block NSUInteger hashCode = 7;
  if (self.hasVersion) {
    hashCode = hashCode * 31 + [self.version hash];
  }
  if (self.hasUpdateTime) {
    hashCode = hashCode * 31 + [[NSNumber numberWithLongLong:self.updateTime] hash];
  }
  if (self.hasDescription) {
    hashCode = hashCode * 31 + [self.description hash];
  }
  hashCode = hashCode * 31 + [self.unknownFields hash];
  return hashCode;
}
@end

@interface SoftwareProfileBuilder()
@property (strong) SoftwareProfile* result;
@end

@implementation SoftwareProfileBuilder
@synthesize result;
- (id) init {
  if ((self = [super init])) {
    self.result = [[SoftwareProfile alloc] init];
  }
  return self;
}
- (PBGeneratedMessage*) internalGetResult {
  return result;
}
- (SoftwareProfileBuilder*) clear {
  self.result = [[SoftwareProfile alloc] init];
  return self;
}
- (SoftwareProfileBuilder*) clone {
  return [SoftwareProfile builderWithPrototype:result];
}
- (SoftwareProfile*) defaultInstance {
  return [SoftwareProfile defaultInstance];
}
- (SoftwareProfile*) build {
  [self checkInitialized];
  return [self buildPartial];
}
- (SoftwareProfile*) buildPartial {
  SoftwareProfile* returnMe = result;
  self.result = nil;
  return returnMe;
}
- (SoftwareProfileBuilder*) mergeFrom:(SoftwareProfile*) other {
  if (other == [SoftwareProfile defaultInstance]) {
    return self;
  }
  if (other.hasVersion) {
    [self setVersion:other.version];
  }
  if (other.hasUpdateTime) {
    [self setUpdateTime:other.updateTime];
  }
  if (other.hasDescription) {
    [self setDescription:other.description];
  }
  [self mergeUnknownFields:other.unknownFields];
  return self;
}
- (SoftwareProfileBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input {
  return [self mergeFromCodedInputStream:input extensionRegistry:[PBExtensionRegistry emptyRegistry]];
}
- (SoftwareProfileBuilder*) mergeFromCodedInputStream:(PBCodedInputStream*) input extensionRegistry:(PBExtensionRegistry*) extensionRegistry {
  PBUnknownFieldSetBuilder* unknownFields = [PBUnknownFieldSet builderWithUnknownFields:self.unknownFields];
  while (YES) {
    SInt32 tag = [input readTag];
    switch (tag) {
      case 0:
        [self setUnknownFields:[unknownFields build]];
        return self;
      default: {
        if (![self parseUnknownField:input unknownFields:unknownFields extensionRegistry:extensionRegistry tag:tag]) {
          [self setUnknownFields:[unknownFields build]];
          return self;
        }
        break;
      }
      case 10: {
        [self setVersion:[input readString]];
        break;
      }
      case 16: {
        [self setUpdateTime:[input readInt64]];
        break;
      }
      case 26: {
        [self setDescription:[input readString]];
        break;
      }
    }
  }
}
- (BOOL) hasVersion {
  return result.hasVersion;
}
- (NSString*) version {
  return result.version;
}
- (SoftwareProfileBuilder*) setVersion:(NSString*) value {
  result.hasVersion = YES;
  result.version = value;
  return self;
}
- (SoftwareProfileBuilder*) clearVersion {
  result.hasVersion = NO;
  result.version = @"";
  return self;
}
- (BOOL) hasUpdateTime {
  return result.hasUpdateTime;
}
- (SInt64) updateTime {
  return result.updateTime;
}
- (SoftwareProfileBuilder*) setUpdateTime:(SInt64) value {
  result.hasUpdateTime = YES;
  result.updateTime = value;
  return self;
}
- (SoftwareProfileBuilder*) clearUpdateTime {
  result.hasUpdateTime = NO;
  result.updateTime = 0L;
  return self;
}
- (BOOL) hasDescription {
  return result.hasDescription;
}
- (NSString*) description {
  return result.description;
}
- (SoftwareProfileBuilder*) setDescription:(NSString*) value {
  result.hasDescription = YES;
  result.description = value;
  return self;
}
- (SoftwareProfileBuilder*) clearDescription {
  result.hasDescription = NO;
  result.description = @"";
  return self;
}
@end


// @@protoc_insertion_point(global_scope)
