/**
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0.
 */

#pragma once
#include <aws/core/utils/memory/stl/AWSStreamFwd.h>
#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/core/utils/memory/stl/AWSVector.h>
#include <aws/ec2/EC2_EXPORTS.h>
#include <aws/ec2/model/ConnectionTrackingSpecificationRequest.h>
#include <aws/ec2/model/EnaSrdSpecificationRequest.h>
#include <aws/ec2/model/InstanceIpv6Address.h>
#include <aws/ec2/model/Ipv4PrefixSpecificationRequest.h>
#include <aws/ec2/model/Ipv6PrefixSpecificationRequest.h>
#include <aws/ec2/model/PrivateIpAddressSpecification.h>

#include <utility>

namespace Aws {
namespace Utils {
namespace Xml {
class XmlNode;
}  // namespace Xml
}  // namespace Utils
namespace EC2 {
namespace Model {

/**
 * <p>Describes a network interface.</p><p><h3>See Also:</h3>   <a
 * href="http://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/InstanceNetworkInterfaceSpecification">AWS
 * API Reference</a></p>
 */
class InstanceNetworkInterfaceSpecification {
 public:
  AWS_EC2_API InstanceNetworkInterfaceSpecification() = default;
  AWS_EC2_API InstanceNetworkInterfaceSpecification(const Aws::Utils::Xml::XmlNode& xmlNode);
  AWS_EC2_API InstanceNetworkInterfaceSpecification& operator=(const Aws::Utils::Xml::XmlNode& xmlNode);

  AWS_EC2_API void OutputToStream(Aws::OStream& ostream, const char* location, unsigned index, const char* locationValue) const;
  AWS_EC2_API void OutputToStream(Aws::OStream& oStream, const char* location) const;

  ///@{
  /**
   * <p>Indicates whether to assign a public IPv4 address to an instance you launch
   * in a VPC. The public IP address can only be assigned to a network interface for
   * eth0, and can only be assigned to a new network interface, not an existing one.
   * You cannot specify more than one network interface in the request. If launching
   * into a default subnet, the default value is <code>true</code>.</p> <p>Amazon Web
   * Services charges for all public IPv4 addresses, including public IPv4 addresses
   * associated with running instances and Elastic IP addresses. For more
   * information, see the <i>Public IPv4 Address</i> tab on the <a
   * href="http://aws.amazon.com/vpc/pricing/">Amazon VPC pricing page</a>.</p>
   */
  inline bool GetAssociatePublicIpAddress() const { return m_associatePublicIpAddress; }
  inline bool AssociatePublicIpAddressHasBeenSet() const { return m_associatePublicIpAddressHasBeenSet; }
  inline void SetAssociatePublicIpAddress(bool value) {
    m_associatePublicIpAddressHasBeenSet = true;
    m_associatePublicIpAddress = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithAssociatePublicIpAddress(bool value) {
    SetAssociatePublicIpAddress(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>If set to <code>true</code>, the interface is deleted when the instance is
   * terminated. You can specify <code>true</code> only if creating a new network
   * interface when launching an instance.</p>
   */
  inline bool GetDeleteOnTermination() const { return m_deleteOnTermination; }
  inline bool DeleteOnTerminationHasBeenSet() const { return m_deleteOnTerminationHasBeenSet; }
  inline void SetDeleteOnTermination(bool value) {
    m_deleteOnTerminationHasBeenSet = true;
    m_deleteOnTermination = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithDeleteOnTermination(bool value) {
    SetDeleteOnTermination(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The description of the network interface. Applies only if creating a network
   * interface when launching an instance.</p>
   */
  inline const Aws::String& GetDescription() const { return m_description; }
  inline bool DescriptionHasBeenSet() const { return m_descriptionHasBeenSet; }
  template <typename DescriptionT = Aws::String>
  void SetDescription(DescriptionT&& value) {
    m_descriptionHasBeenSet = true;
    m_description = std::forward<DescriptionT>(value);
  }
  template <typename DescriptionT = Aws::String>
  InstanceNetworkInterfaceSpecification& WithDescription(DescriptionT&& value) {
    SetDescription(std::forward<DescriptionT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The position of the network interface in the attachment order. A primary
   * network interface has a device index of 0.</p> <p>If you specify a network
   * interface when launching an instance, you must specify the device index.</p>
   */
  inline int GetDeviceIndex() const { return m_deviceIndex; }
  inline bool DeviceIndexHasBeenSet() const { return m_deviceIndexHasBeenSet; }
  inline void SetDeviceIndex(int value) {
    m_deviceIndexHasBeenSet = true;
    m_deviceIndex = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithDeviceIndex(int value) {
    SetDeviceIndex(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The IDs of the security groups for the network interface. Applies only if
   * creating a network interface when launching an instance.</p>
   */
  inline const Aws::Vector<Aws::String>& GetGroups() const { return m_groups; }
  inline bool GroupsHasBeenSet() const { return m_groupsHasBeenSet; }
  template <typename GroupsT = Aws::Vector<Aws::String>>
  void SetGroups(GroupsT&& value) {
    m_groupsHasBeenSet = true;
    m_groups = std::forward<GroupsT>(value);
  }
  template <typename GroupsT = Aws::Vector<Aws::String>>
  InstanceNetworkInterfaceSpecification& WithGroups(GroupsT&& value) {
    SetGroups(std::forward<GroupsT>(value));
    return *this;
  }
  template <typename GroupsT = Aws::String>
  InstanceNetworkInterfaceSpecification& AddGroups(GroupsT&& value) {
    m_groupsHasBeenSet = true;
    m_groups.emplace_back(std::forward<GroupsT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>A number of IPv6 addresses to assign to the network interface. Amazon EC2
   * chooses the IPv6 addresses from the range of the subnet. You cannot specify this
   * option and the option to assign specific IPv6 addresses in the same request. You
   * can specify this option if you've specified a minimum number of instances to
   * launch.</p>
   */
  inline int GetIpv6AddressCount() const { return m_ipv6AddressCount; }
  inline bool Ipv6AddressCountHasBeenSet() const { return m_ipv6AddressCountHasBeenSet; }
  inline void SetIpv6AddressCount(int value) {
    m_ipv6AddressCountHasBeenSet = true;
    m_ipv6AddressCount = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithIpv6AddressCount(int value) {
    SetIpv6AddressCount(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The IPv6 addresses to assign to the network interface. You cannot specify
   * this option and the option to assign a number of IPv6 addresses in the same
   * request. You cannot specify this option if you've specified a minimum number of
   * instances to launch.</p>
   */
  inline const Aws::Vector<InstanceIpv6Address>& GetIpv6Addresses() const { return m_ipv6Addresses; }
  inline bool Ipv6AddressesHasBeenSet() const { return m_ipv6AddressesHasBeenSet; }
  template <typename Ipv6AddressesT = Aws::Vector<InstanceIpv6Address>>
  void SetIpv6Addresses(Ipv6AddressesT&& value) {
    m_ipv6AddressesHasBeenSet = true;
    m_ipv6Addresses = std::forward<Ipv6AddressesT>(value);
  }
  template <typename Ipv6AddressesT = Aws::Vector<InstanceIpv6Address>>
  InstanceNetworkInterfaceSpecification& WithIpv6Addresses(Ipv6AddressesT&& value) {
    SetIpv6Addresses(std::forward<Ipv6AddressesT>(value));
    return *this;
  }
  template <typename Ipv6AddressesT = InstanceIpv6Address>
  InstanceNetworkInterfaceSpecification& AddIpv6Addresses(Ipv6AddressesT&& value) {
    m_ipv6AddressesHasBeenSet = true;
    m_ipv6Addresses.emplace_back(std::forward<Ipv6AddressesT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The ID of the network interface.</p> <p>If you are creating a Spot Fleet,
   * omit this parameter because you can’t specify a network interface ID in a launch
   * specification.</p>
   */
  inline const Aws::String& GetNetworkInterfaceId() const { return m_networkInterfaceId; }
  inline bool NetworkInterfaceIdHasBeenSet() const { return m_networkInterfaceIdHasBeenSet; }
  template <typename NetworkInterfaceIdT = Aws::String>
  void SetNetworkInterfaceId(NetworkInterfaceIdT&& value) {
    m_networkInterfaceIdHasBeenSet = true;
    m_networkInterfaceId = std::forward<NetworkInterfaceIdT>(value);
  }
  template <typename NetworkInterfaceIdT = Aws::String>
  InstanceNetworkInterfaceSpecification& WithNetworkInterfaceId(NetworkInterfaceIdT&& value) {
    SetNetworkInterfaceId(std::forward<NetworkInterfaceIdT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The private IPv4 address of the network interface. Applies only if creating a
   * network interface when launching an instance. You cannot specify this option if
   * you're launching more than one instance in a <a
   * href="https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html">RunInstances</a>
   * request.</p>
   */
  inline const Aws::String& GetPrivateIpAddress() const { return m_privateIpAddress; }
  inline bool PrivateIpAddressHasBeenSet() const { return m_privateIpAddressHasBeenSet; }
  template <typename PrivateIpAddressT = Aws::String>
  void SetPrivateIpAddress(PrivateIpAddressT&& value) {
    m_privateIpAddressHasBeenSet = true;
    m_privateIpAddress = std::forward<PrivateIpAddressT>(value);
  }
  template <typename PrivateIpAddressT = Aws::String>
  InstanceNetworkInterfaceSpecification& WithPrivateIpAddress(PrivateIpAddressT&& value) {
    SetPrivateIpAddress(std::forward<PrivateIpAddressT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The private IPv4 addresses to assign to the network interface. Only one
   * private IPv4 address can be designated as primary. You cannot specify this
   * option if you're launching more than one instance in a <a
   * href="https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html">RunInstances</a>
   * request.</p>
   */
  inline const Aws::Vector<PrivateIpAddressSpecification>& GetPrivateIpAddresses() const { return m_privateIpAddresses; }
  inline bool PrivateIpAddressesHasBeenSet() const { return m_privateIpAddressesHasBeenSet; }
  template <typename PrivateIpAddressesT = Aws::Vector<PrivateIpAddressSpecification>>
  void SetPrivateIpAddresses(PrivateIpAddressesT&& value) {
    m_privateIpAddressesHasBeenSet = true;
    m_privateIpAddresses = std::forward<PrivateIpAddressesT>(value);
  }
  template <typename PrivateIpAddressesT = Aws::Vector<PrivateIpAddressSpecification>>
  InstanceNetworkInterfaceSpecification& WithPrivateIpAddresses(PrivateIpAddressesT&& value) {
    SetPrivateIpAddresses(std::forward<PrivateIpAddressesT>(value));
    return *this;
  }
  template <typename PrivateIpAddressesT = PrivateIpAddressSpecification>
  InstanceNetworkInterfaceSpecification& AddPrivateIpAddresses(PrivateIpAddressesT&& value) {
    m_privateIpAddressesHasBeenSet = true;
    m_privateIpAddresses.emplace_back(std::forward<PrivateIpAddressesT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The number of secondary private IPv4 addresses. You can’t specify this
   * parameter and also specify a secondary private IP address using the
   * <code>PrivateIpAddress</code> parameter.</p>
   */
  inline int GetSecondaryPrivateIpAddressCount() const { return m_secondaryPrivateIpAddressCount; }
  inline bool SecondaryPrivateIpAddressCountHasBeenSet() const { return m_secondaryPrivateIpAddressCountHasBeenSet; }
  inline void SetSecondaryPrivateIpAddressCount(int value) {
    m_secondaryPrivateIpAddressCountHasBeenSet = true;
    m_secondaryPrivateIpAddressCount = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithSecondaryPrivateIpAddressCount(int value) {
    SetSecondaryPrivateIpAddressCount(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The ID of the subnet associated with the network interface. Applies only if
   * creating a network interface when launching an instance.</p>
   */
  inline const Aws::String& GetSubnetId() const { return m_subnetId; }
  inline bool SubnetIdHasBeenSet() const { return m_subnetIdHasBeenSet; }
  template <typename SubnetIdT = Aws::String>
  void SetSubnetId(SubnetIdT&& value) {
    m_subnetIdHasBeenSet = true;
    m_subnetId = std::forward<SubnetIdT>(value);
  }
  template <typename SubnetIdT = Aws::String>
  InstanceNetworkInterfaceSpecification& WithSubnetId(SubnetIdT&& value) {
    SetSubnetId(std::forward<SubnetIdT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>Indicates whether to assign a carrier IP address to the network
   * interface.</p> <p>You can only assign a carrier IP address to a network
   * interface that is in a subnet in a Wavelength Zone. For more information about
   * carrier IP addresses, see <a
   * href="https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html#provider-owned-ip">Carrier
   * IP address</a> in the <i>Amazon Web Services Wavelength Developer Guide</i>.</p>
   */
  inline bool GetAssociateCarrierIpAddress() const { return m_associateCarrierIpAddress; }
  inline bool AssociateCarrierIpAddressHasBeenSet() const { return m_associateCarrierIpAddressHasBeenSet; }
  inline void SetAssociateCarrierIpAddress(bool value) {
    m_associateCarrierIpAddressHasBeenSet = true;
    m_associateCarrierIpAddress = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithAssociateCarrierIpAddress(bool value) {
    SetAssociateCarrierIpAddress(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The type of network interface.</p> <p>If you specify <code>efa-only</code>,
   * do not assign any IP addresses to the network interface. EFA-only network
   * interfaces do not support IP addresses.</p> <p>Valid values:
   * <code>interface</code> | <code>efa</code> | <code>efa-only</code> </p>
   */
  inline const Aws::String& GetInterfaceType() const { return m_interfaceType; }
  inline bool InterfaceTypeHasBeenSet() const { return m_interfaceTypeHasBeenSet; }
  template <typename InterfaceTypeT = Aws::String>
  void SetInterfaceType(InterfaceTypeT&& value) {
    m_interfaceTypeHasBeenSet = true;
    m_interfaceType = std::forward<InterfaceTypeT>(value);
  }
  template <typename InterfaceTypeT = Aws::String>
  InstanceNetworkInterfaceSpecification& WithInterfaceType(InterfaceTypeT&& value) {
    SetInterfaceType(std::forward<InterfaceTypeT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The index of the network card. Some instance types support multiple network
   * cards. The primary network interface must be assigned to network card index 0.
   * The default is network card index 0.</p> <p>If you are using <a
   * href="https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html">RequestSpotInstances</a>
   * to create Spot Instances, omit this parameter because you can’t specify the
   * network card index when using this API. To specify the network card index, use
   * <a
   * href="https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html">RunInstances</a>.</p>
   */
  inline int GetNetworkCardIndex() const { return m_networkCardIndex; }
  inline bool NetworkCardIndexHasBeenSet() const { return m_networkCardIndexHasBeenSet; }
  inline void SetNetworkCardIndex(int value) {
    m_networkCardIndexHasBeenSet = true;
    m_networkCardIndex = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithNetworkCardIndex(int value) {
    SetNetworkCardIndex(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The IPv4 delegated prefixes to be assigned to the network interface. You
   * cannot use this option if you use the <code>Ipv4PrefixCount</code> option.</p>
   */
  inline const Aws::Vector<Ipv4PrefixSpecificationRequest>& GetIpv4Prefixes() const { return m_ipv4Prefixes; }
  inline bool Ipv4PrefixesHasBeenSet() const { return m_ipv4PrefixesHasBeenSet; }
  template <typename Ipv4PrefixesT = Aws::Vector<Ipv4PrefixSpecificationRequest>>
  void SetIpv4Prefixes(Ipv4PrefixesT&& value) {
    m_ipv4PrefixesHasBeenSet = true;
    m_ipv4Prefixes = std::forward<Ipv4PrefixesT>(value);
  }
  template <typename Ipv4PrefixesT = Aws::Vector<Ipv4PrefixSpecificationRequest>>
  InstanceNetworkInterfaceSpecification& WithIpv4Prefixes(Ipv4PrefixesT&& value) {
    SetIpv4Prefixes(std::forward<Ipv4PrefixesT>(value));
    return *this;
  }
  template <typename Ipv4PrefixesT = Ipv4PrefixSpecificationRequest>
  InstanceNetworkInterfaceSpecification& AddIpv4Prefixes(Ipv4PrefixesT&& value) {
    m_ipv4PrefixesHasBeenSet = true;
    m_ipv4Prefixes.emplace_back(std::forward<Ipv4PrefixesT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The number of IPv4 delegated prefixes to be automatically assigned to the
   * network interface. You cannot use this option if you use the
   * <code>Ipv4Prefix</code> option.</p>
   */
  inline int GetIpv4PrefixCount() const { return m_ipv4PrefixCount; }
  inline bool Ipv4PrefixCountHasBeenSet() const { return m_ipv4PrefixCountHasBeenSet; }
  inline void SetIpv4PrefixCount(int value) {
    m_ipv4PrefixCountHasBeenSet = true;
    m_ipv4PrefixCount = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithIpv4PrefixCount(int value) {
    SetIpv4PrefixCount(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The IPv6 delegated prefixes to be assigned to the network interface. You
   * cannot use this option if you use the <code>Ipv6PrefixCount</code> option.</p>
   */
  inline const Aws::Vector<Ipv6PrefixSpecificationRequest>& GetIpv6Prefixes() const { return m_ipv6Prefixes; }
  inline bool Ipv6PrefixesHasBeenSet() const { return m_ipv6PrefixesHasBeenSet; }
  template <typename Ipv6PrefixesT = Aws::Vector<Ipv6PrefixSpecificationRequest>>
  void SetIpv6Prefixes(Ipv6PrefixesT&& value) {
    m_ipv6PrefixesHasBeenSet = true;
    m_ipv6Prefixes = std::forward<Ipv6PrefixesT>(value);
  }
  template <typename Ipv6PrefixesT = Aws::Vector<Ipv6PrefixSpecificationRequest>>
  InstanceNetworkInterfaceSpecification& WithIpv6Prefixes(Ipv6PrefixesT&& value) {
    SetIpv6Prefixes(std::forward<Ipv6PrefixesT>(value));
    return *this;
  }
  template <typename Ipv6PrefixesT = Ipv6PrefixSpecificationRequest>
  InstanceNetworkInterfaceSpecification& AddIpv6Prefixes(Ipv6PrefixesT&& value) {
    m_ipv6PrefixesHasBeenSet = true;
    m_ipv6Prefixes.emplace_back(std::forward<Ipv6PrefixesT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The number of IPv6 delegated prefixes to be automatically assigned to the
   * network interface. You cannot use this option if you use the
   * <code>Ipv6Prefix</code> option.</p>
   */
  inline int GetIpv6PrefixCount() const { return m_ipv6PrefixCount; }
  inline bool Ipv6PrefixCountHasBeenSet() const { return m_ipv6PrefixCountHasBeenSet; }
  inline void SetIpv6PrefixCount(int value) {
    m_ipv6PrefixCountHasBeenSet = true;
    m_ipv6PrefixCount = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithIpv6PrefixCount(int value) {
    SetIpv6PrefixCount(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The primary IPv6 address of the network interface. When you enable an IPv6
   * GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary
   * IPv6 address until the instance is terminated or the network interface is
   * detached. For more information about primary IPv6 addresses, see <a
   * href="https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html">RunInstances</a>.</p>
   */
  inline bool GetPrimaryIpv6() const { return m_primaryIpv6; }
  inline bool PrimaryIpv6HasBeenSet() const { return m_primaryIpv6HasBeenSet; }
  inline void SetPrimaryIpv6(bool value) {
    m_primaryIpv6HasBeenSet = true;
    m_primaryIpv6 = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithPrimaryIpv6(bool value) {
    SetPrimaryIpv6(value);
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>Specifies the ENA Express settings for the network interface that's attached
   * to the instance.</p>
   */
  inline const EnaSrdSpecificationRequest& GetEnaSrdSpecification() const { return m_enaSrdSpecification; }
  inline bool EnaSrdSpecificationHasBeenSet() const { return m_enaSrdSpecificationHasBeenSet; }
  template <typename EnaSrdSpecificationT = EnaSrdSpecificationRequest>
  void SetEnaSrdSpecification(EnaSrdSpecificationT&& value) {
    m_enaSrdSpecificationHasBeenSet = true;
    m_enaSrdSpecification = std::forward<EnaSrdSpecificationT>(value);
  }
  template <typename EnaSrdSpecificationT = EnaSrdSpecificationRequest>
  InstanceNetworkInterfaceSpecification& WithEnaSrdSpecification(EnaSrdSpecificationT&& value) {
    SetEnaSrdSpecification(std::forward<EnaSrdSpecificationT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>A security group connection tracking specification that enables you to set
   * the timeout for connection tracking on an Elastic network interface. For more
   * information, see <a
   * href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts">Connection
   * tracking timeouts</a> in the <i>Amazon EC2 User Guide</i>.</p>
   */
  inline const ConnectionTrackingSpecificationRequest& GetConnectionTrackingSpecification() const {
    return m_connectionTrackingSpecification;
  }
  inline bool ConnectionTrackingSpecificationHasBeenSet() const { return m_connectionTrackingSpecificationHasBeenSet; }
  template <typename ConnectionTrackingSpecificationT = ConnectionTrackingSpecificationRequest>
  void SetConnectionTrackingSpecification(ConnectionTrackingSpecificationT&& value) {
    m_connectionTrackingSpecificationHasBeenSet = true;
    m_connectionTrackingSpecification = std::forward<ConnectionTrackingSpecificationT>(value);
  }
  template <typename ConnectionTrackingSpecificationT = ConnectionTrackingSpecificationRequest>
  InstanceNetworkInterfaceSpecification& WithConnectionTrackingSpecification(ConnectionTrackingSpecificationT&& value) {
    SetConnectionTrackingSpecification(std::forward<ConnectionTrackingSpecificationT>(value));
    return *this;
  }
  ///@}

  ///@{
  /**
   * <p>The number of ENA queues to be created with the instance.</p>
   */
  inline int GetEnaQueueCount() const { return m_enaQueueCount; }
  inline bool EnaQueueCountHasBeenSet() const { return m_enaQueueCountHasBeenSet; }
  inline void SetEnaQueueCount(int value) {
    m_enaQueueCountHasBeenSet = true;
    m_enaQueueCount = value;
  }
  inline InstanceNetworkInterfaceSpecification& WithEnaQueueCount(int value) {
    SetEnaQueueCount(value);
    return *this;
  }
  ///@}
 private:
  bool m_associatePublicIpAddress{false};

  bool m_deleteOnTermination{false};

  Aws::String m_description;

  int m_deviceIndex{0};

  Aws::Vector<Aws::String> m_groups;

  int m_ipv6AddressCount{0};

  Aws::Vector<InstanceIpv6Address> m_ipv6Addresses;

  Aws::String m_networkInterfaceId;

  Aws::String m_privateIpAddress;

  Aws::Vector<PrivateIpAddressSpecification> m_privateIpAddresses;

  int m_secondaryPrivateIpAddressCount{0};

  Aws::String m_subnetId;

  bool m_associateCarrierIpAddress{false};

  Aws::String m_interfaceType;

  int m_networkCardIndex{0};

  Aws::Vector<Ipv4PrefixSpecificationRequest> m_ipv4Prefixes;

  int m_ipv4PrefixCount{0};

  Aws::Vector<Ipv6PrefixSpecificationRequest> m_ipv6Prefixes;

  int m_ipv6PrefixCount{0};

  bool m_primaryIpv6{false};

  EnaSrdSpecificationRequest m_enaSrdSpecification;

  ConnectionTrackingSpecificationRequest m_connectionTrackingSpecification;

  int m_enaQueueCount{0};
  bool m_associatePublicIpAddressHasBeenSet = false;
  bool m_deleteOnTerminationHasBeenSet = false;
  bool m_descriptionHasBeenSet = false;
  bool m_deviceIndexHasBeenSet = false;
  bool m_groupsHasBeenSet = false;
  bool m_ipv6AddressCountHasBeenSet = false;
  bool m_ipv6AddressesHasBeenSet = false;
  bool m_networkInterfaceIdHasBeenSet = false;
  bool m_privateIpAddressHasBeenSet = false;
  bool m_privateIpAddressesHasBeenSet = false;
  bool m_secondaryPrivateIpAddressCountHasBeenSet = false;
  bool m_subnetIdHasBeenSet = false;
  bool m_associateCarrierIpAddressHasBeenSet = false;
  bool m_interfaceTypeHasBeenSet = false;
  bool m_networkCardIndexHasBeenSet = false;
  bool m_ipv4PrefixesHasBeenSet = false;
  bool m_ipv4PrefixCountHasBeenSet = false;
  bool m_ipv6PrefixesHasBeenSet = false;
  bool m_ipv6PrefixCountHasBeenSet = false;
  bool m_primaryIpv6HasBeenSet = false;
  bool m_enaSrdSpecificationHasBeenSet = false;
  bool m_connectionTrackingSpecificationHasBeenSet = false;
  bool m_enaQueueCountHasBeenSet = false;
};

}  // namespace Model
}  // namespace EC2
}  // namespace Aws
