// Protocol Buffers for Objective C
//
// Copyright 2010 Booyah Inc.
// Copyright 2008 Cyrus Najmabadi
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

@class PBCodedOutputStream;
@class PBField;
@class PBUnknownFieldSetBuilder;

@interface PBUnknownFieldSet : NSObject {
@private
  NSDictionary* fields;
}

@property (readonly, strong) NSDictionary* fields;

+ (PBUnknownFieldSet*) defaultInstance;

+ (PBUnknownFieldSet*) setWithFields:(NSMutableDictionary*) fields;
+ (PBUnknownFieldSet*) parseFromData:(NSData*) data;

+ (PBUnknownFieldSetBuilder*) builder;
+ (PBUnknownFieldSetBuilder*) builderWithUnknownFields:(PBUnknownFieldSet*) other;

- (void) writeAsMessageSetTo:(PBCodedOutputStream*) output;
- (void) writeToCodedOutputStream:(PBCodedOutputStream*) output;
- (NSData*) data;

- (SInt32) serializedSize;
- (SInt32) serializedSizeAsMessageSet;

- (BOOL) hasField:(SInt32) number;
- (PBField*) getField:(SInt32) number;

- (void) writeDescriptionTo:(NSMutableString*) output
                 withIndent:(NSString*) indent;

@end
