// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef QUICHE_QUIC_PLATFORM_API_QUIC_ENDIAN_H_
#define QUICHE_QUIC_PLATFORM_API_QUIC_ENDIAN_H_

#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
#include "net/quic/platform/impl/quic_endian_impl.h"

namespace quic {

enum Endianness {
  NETWORK_BYTE_ORDER,  // big endian
  HOST_BYTE_ORDER      // little endian
};

// Provide utility functions that convert from/to network order (big endian)
// to/from host order (can be either little or big endian depending on the
// platform).
class QUIC_EXPORT_PRIVATE QuicEndian {
 public:
  // Convert |x| from host order (can be either little or big endian depending
  // on the platform) to network order (big endian).
  static uint16_t HostToNet16(uint16_t x) {
    return QuicEndianImpl::HostToNet16(x);
  }
  static uint32_t HostToNet32(uint32_t x) {
    return QuicEndianImpl::HostToNet32(x);
  }
  static uint64_t HostToNet64(uint64_t x) {
    return QuicEndianImpl::HostToNet64(x);
  }

  // Convert |x| from network order (big endian) to host order (can be either
  // little or big endian depending on the platform).
  static uint16_t NetToHost16(uint16_t x) {
    return QuicEndianImpl::NetToHost16(x);
  }
  static uint32_t NetToHost32(uint32_t x) {
    return QuicEndianImpl::NetToHost32(x);
  }
  static uint64_t NetToHost64(uint64_t x) {
    return QuicEndianImpl::NetToHost64(x);
  }

  // Returns true if current host order is little endian.
  static bool HostIsLittleEndian() {
    return QuicEndianImpl::HostIsLittleEndian();
  }
};

}  // namespace quic

#endif  // QUICHE_QUIC_PLATFORM_API_QUIC_ENDIAN_H_
