136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- EndianStream.h - Stream ops with endian specific data ----*- C++ -*-===//
236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source
636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details.
736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file defines utilities for operating on streams that have endian
1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// specific data.
1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//
1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===//
1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef _LLVM_SUPPORT_ENDIAN_STREAM_H_
1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define _LLVM_SUPPORT_ENDIAN_STREAM_H_
1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <llvm/Support/Endian.h>
1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include <llvm/Support/raw_ostream.h>
2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace llvm {
2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace support {
2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace endian {
2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines/// Adapter to write values to a stream in a particular byte order.
2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <endianness endian> struct Writer {
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  raw_ostream &OS;
2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  Writer(raw_ostream &OS) : OS(OS) {}
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  template <typename value_type> void write(value_type Val) {
3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    Val = byte_swap<value_type, endian>(Val);
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    OS.write((const char *)&Val, sizeof(value_type));
3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace endian
3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace support
3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end namespace llvm
3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#endif // _LLVM_SUPPORT_ENDIAN_STREAM_H_
40