1181624Skmacy//===- EndianStream.h - Stream ops with endian specific data ----*- C++ -*-===// 2181624Skmacy// 3181624Skmacy// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4181624Skmacy// See https://llvm.org/LICENSE.txt for license information. 5181624Skmacy// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6181624Skmacy// 7181624Skmacy//===----------------------------------------------------------------------===// 8181624Skmacy// 9181624Skmacy// This file defines utilities for operating on streams that have endian 10181624Skmacy// specific data. 11181624Skmacy// 12181624Skmacy//===----------------------------------------------------------------------===// 13181624Skmacy 14181624Skmacy#ifndef LLVM_SUPPORT_ENDIANSTREAM_H 15181624Skmacy#define LLVM_SUPPORT_ENDIANSTREAM_H 16181624Skmacy 17181624Skmacy#include "llvm/ADT/ArrayRef.h" 18183340Skmacy#include "llvm/Support/Endian.h" 19181624Skmacy#include "llvm/Support/raw_ostream.h" 20181624Skmacy 21181624Skmacynamespace llvm { 22181624Skmacynamespace support { 23181624Skmacy 24181624Skmacynamespace endian { 25181624Skmacy 26181624Skmacytemplate <typename value_type> 27181624Skmacyinline void write(raw_ostream &os, value_type value, endianness endian) { 28181624Skmacy value = byte_swap<value_type>(value, endian); 29189699Sdfr os.write((const char *)&value, sizeof(value_type)); 30189699Sdfr} 31189699Sdfr 32181624Skmacytemplate <> 33186557Skmacyinline void write<float>(raw_ostream &os, float value, endianness endian) { 34181624Skmacy write(os, FloatToBits(value), endian); 35181624Skmacy} 36189699Sdfr 37189699Sdfrtemplate <> 38189699Sdfrinline void write<double>(raw_ostream &os, double value, 39189699Sdfr endianness endian) { 40189699Sdfr write(os, DoubleToBits(value), endian); 41181624Skmacy} 42181624Skmacy 43181624Skmacytemplate <typename value_type> 44181624Skmacyinline void write(raw_ostream &os, ArrayRef<value_type> vals, 45181624Skmacy endianness endian) { 46181624Skmacy for (value_type v : vals) 47181624Skmacy write(os, v, endian); 48181624Skmacy} 49181624Skmacy 50181624Skmacy/// Adapter to write values to a stream in a particular byte order. 51181624Skmacystruct Writer { 52181624Skmacy raw_ostream &OS; 53181624Skmacy endianness Endian; 54181624Skmacy Writer(raw_ostream &OS, endianness Endian) : OS(OS), Endian(Endian) {} 55181624Skmacy template <typename value_type> void write(ArrayRef<value_type> Val) { 56181624Skmacy endian::write(OS, Val, Endian); 57181624Skmacy } 58181624Skmacy template <typename value_type> void write(value_type Val) { 59181624Skmacy endian::write(OS, Val, Endian); 60181624Skmacy } 61181624Skmacy}; 62181624Skmacy 63181624Skmacy} // end namespace endian 64186557Skmacy 65181624Skmacy} // end namespace support 66189699Sdfr} // end namespace llvm 67181624Skmacy 68214077Sgibbs#endif 69181624Skmacy