// Copyright 2011 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 MINI_CHROMIUM_BASE_SYS_BYTEORDER_H_
#define MINI_CHROMIUM_BASE_SYS_BYTEORDER_H_

#include "base/macros.h"
#include "build/build_config.h"

#if defined(OS_APPLE)
#include <libkern/OSByteOrder.h>
#elif defined(OS_WIN)
#include <stdlib.h>
#else
#include <byteswap.h>
#endif

namespace base {

inline uint16_t ByteSwap(uint16_t x) {
#if defined(OS_APPLE)
  return OSSwapInt16(x);
#elif defined(OS_WIN)
  return _byteswap_ushort(x);
#else
  return bswap_16(x);
#endif
}

inline uint32_t ByteSwap(uint32_t x) {
#if defined(OS_APPLE)
  return OSSwapInt32(x);
#elif defined(OS_WIN)
  return _byteswap_ulong(x);
#else
  return bswap_32(x);
#endif
}

inline uint64_t ByteSwap(uint64_t x) {
#if defined(OS_APPLE)
  return OSSwapInt64(x);
#elif defined(OS_WIN)
  return _byteswap_uint64(x);
#else
  return bswap_64(x);
#endif
}

inline uint16_t NetToHost16(uint16_t x) {
#if defined(ARCH_CPU_LITTLE_ENDIAN)
  return ByteSwap(x);
#else
  return x;
#endif
}

inline uint32_t NetToHost32(uint32_t x) {
#if defined(ARCH_CPU_LITTLE_ENDIAN)
  return ByteSwap(x);
#else
  return x;
#endif
}

inline uint64_t NetToHost64(uint64_t x) {
#if defined(ARCH_CPU_LITTLE_ENDIAN)
  return ByteSwap(x);
#else
  return x;
#endif
}

inline uint16_t HostToNet16(uint16_t x) {
#if defined(ARCH_CPU_LITTLE_ENDIAN)
  return ByteSwap(x);
#else
  return x;
#endif
}

inline uint32_t HostToNet32(uint32_t x) {
#if defined(ARCH_CPU_LITTLE_ENDIAN)
  return ByteSwap(x);
#else
  return x;
#endif
}

inline uint64_t HostToNet64(uint64_t x) {
#if defined(ARCH_CPU_LITTLE_ENDIAN)
  return ByteSwap(x);
#else
  return x;
#endif
}

}  // namespace base

#endif  // MINI_CHROMIUM_BASE_SYS_BYTEORDER_H_
