// 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.

#import "GeneratedMessage.h"

#import "ExtensionField.h"

/**
 * Generated message classes for message types that contain extension ranges
 * subclass this.
 *
 * <p>This class implements type-safe accessors for extensions.  They
 * implement all the same operations that you can do with normal fields --
 * e.g. "has", "get", and "getCount" -- but for extensions.  The extensions
 * are identified using instances of the class {@link GeneratedExtension};
 * the protocol compiler generates a static instance of this class for every
 * extension in its input.  Through the magic of generics, all is made
 * type-safe.
 *
 * <p>For example, imagine you have the {@code .proto} file:
 *
 * <pre>
 * option java_class = "MyProto";
 *
 * message Foo {
 *   extensions 1000 to max;
 * }
 *
 * extend Foo {
 *   optional int32 bar;
 * }
 * </pre>
 *
 * <p>Then you might write code like:
 *
 * <pre>
 * MyProto.Foo foo = getFoo();
 * int i = foo.getExtension(MyProto.bar);
 * </pre>
 *
 * <p>See also {@link ExtendableBuilder}.
 */
@interface PBExtendableMessage : PBGeneratedMessage {
@private
  NSMutableDictionary* extensionMap;
  NSMutableDictionary* extensionRegistry;
}

@property (strong) NSMutableDictionary* extensionMap;
@property (strong) NSMutableDictionary* extensionRegistry;

- (BOOL) hasExtension:(id<PBExtensionField>) extension;
- (id) getExtension:(id<PBExtensionField>) extension;

//@protected
- (BOOL) extensionsAreInitialized;
- (SInt32) extensionsSerializedSize;
- (void) writeExtensionsToCodedOutputStream:(PBCodedOutputStream*) output
                                       from:(SInt32) startInclusive
                                         to:(SInt32) endExclusive;
- (void) writeExtensionDescriptionToMutableString:(NSMutableString*) output
                                             from:(SInt32) startInclusive
                                               to:(SInt32) endExclusive
                                       withIndent:(NSString*) indent;
- (BOOL) isEqualExtensionsInOther:(PBExtendableMessage*)otherMessage
                             from:(SInt32) startInclusive
                               to:(SInt32) endExclusive;
- (NSUInteger) hashExtensionsFrom:(SInt32) startInclusive
                               to:(SInt32) endExclusive;



/* @internal */
- (void) ensureExtensionIsRegistered:(id<PBExtensionField>) extension;

@end
