// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc.  All rights reserved.
// https://developers.google.com/protocol-buffers/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//     * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#import <Foundation/Foundation.h>

#import "GPBBootstrap.h"

@class GPBEnumDescriptor;
@class GPBMessage;
@class GPBInt32Array;

// Function used to verify that a given value can be represented by an
// enum type.
typedef BOOL (*GPBEnumValidationFunc)(int32_t);

// Function used to fetch an EnumDescriptor.
typedef GPBEnumDescriptor *(*GPBEnumDescriptorFunc)(void);

// Magic values used for when an the at runtime to indicate an enum value
// that wasn't know at compile time.
enum {
  kGPBUnrecognizedEnumeratorValue = (int32_t)0xFBADBEEF,
};

// A union for storing all possible Protobuf values.
// Note that owner is responsible for memory management of object types.
typedef union {
  BOOL valueBool;
  int32_t valueInt32;
  int64_t valueInt64;
  uint32_t valueUInt32;
  uint64_t valueUInt64;
  float valueFloat;
  double valueDouble;
  GPB_UNSAFE_UNRETAINED NSData *valueData;
  GPB_UNSAFE_UNRETAINED NSString *valueString;
  GPB_UNSAFE_UNRETAINED GPBMessage *valueMessage;
  int32_t valueEnum;
} GPBGenericValue;

// Do not change the order of this enum (or add things to it) without thinking
// about it very carefully. There are several things that depend on the order.
typedef NS_ENUM(uint8_t, GPBDataType) {
  GPBDataTypeBool = 0,
  GPBDataTypeFixed32,
  GPBDataTypeSFixed32,
  GPBDataTypeFloat,
  GPBDataTypeFixed64,
  GPBDataTypeSFixed64,
  GPBDataTypeDouble,
  GPBDataTypeInt32,
  GPBDataTypeInt64,
  GPBDataTypeSInt32,
  GPBDataTypeSInt64,
  GPBDataTypeUInt32,
  GPBDataTypeUInt64,
  GPBDataTypeBytes,
  GPBDataTypeString,
  GPBDataTypeMessage,
  GPBDataTypeGroup,
  GPBDataTypeEnum,
};

enum {
  // A count of the number of types in GPBDataType. Separated out from the
  // GPBDataType enum to avoid warnings regarding not handling
  // GPBDataType_Count in switch statements.
  GPBDataType_Count = GPBDataTypeEnum + 1
};

// An extension range.
typedef struct GPBExtensionRange {
  uint32_t start;  // inclusive
  uint32_t end;    // exclusive
} GPBExtensionRange;
