#region Copyright notice and license
// Protocol Buffers - Google's data interchange format
// Copyright 2008 Google Inc. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
#endregion
using System;
namespace Google.Protobuf
{
///
/// Represents a non-generic extension definition. This API is experimental and subject to change.
///
public abstract class Extension
{
internal abstract Type TargetType { get; }
///
/// Internal use. Creates a new extension with the specified field number.
///
protected Extension(int fieldNumber)
{
FieldNumber = fieldNumber;
}
internal abstract IExtensionValue CreateValue();
///
/// Gets the field number of this extension
///
public int FieldNumber { get; }
internal abstract bool IsRepeated { get; }
}
///
/// Represents a type-safe extension identifier used for getting and setting single extension values in instances.
/// This API is experimental and subject to change.
///
/// The message type this field applies to
/// The field value type of this extension
public sealed class Extension : Extension where TTarget : IExtendableMessage
{
private readonly FieldCodec codec;
///
/// Creates a new extension identifier with the specified field number and codec
///
public Extension(int fieldNumber, FieldCodec codec) : base(fieldNumber)
{
this.codec = codec;
}
internal TValue DefaultValue => codec != null ? codec.DefaultValue : default;
internal override Type TargetType => typeof(TTarget);
internal override bool IsRepeated => false;
internal override IExtensionValue CreateValue()
{
return new ExtensionValue(codec);
}
}
///
/// Represents a type-safe extension identifier used for getting repeated extension values in instances.
/// This API is experimental and subject to change.
///
/// The message type this field applies to
/// The repeated field value type of this extension
public sealed class RepeatedExtension : Extension where TTarget : IExtendableMessage
{
private readonly FieldCodec codec;
///
/// Creates a new repeated extension identifier with the specified field number and codec
///
public RepeatedExtension(int fieldNumber, FieldCodec codec) : base(fieldNumber)
{
this.codec = codec;
}
internal override Type TargetType => typeof(TTarget);
internal override bool IsRepeated => true;
internal override IExtensionValue CreateValue()
{
return new RepeatedExtensionValue(codec);
}
}
}