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