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