1//===- EndianStream.h - Stream ops with endian specific data ----*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines utilities for operating on streams that have endian
10// specific data.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_SUPPORT_ENDIANSTREAM_H
15#define LLVM_SUPPORT_ENDIANSTREAM_H
16
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/SmallVector.h"
19#include "llvm/Support/Endian.h"
20#include "llvm/Support/raw_ostream.h"
21
22namespace llvm {
23namespace support {
24
25namespace endian {
26
27template <typename value_type>
28inline void write_array(raw_ostream &os, ArrayRef<value_type> values,
29 endianness endian) {
30 for (const auto orig : values) {
31 value_type value = byte_swap<value_type>(orig, endian);
32 os.write(Ptr: (const char *)&value, Size: sizeof(value_type));
33 }
34}
35
36template <typename value_type>
37inline void write(raw_ostream &os, value_type value, endianness endian) {
38 value = byte_swap<value_type>(value, endian);
39 os.write(Ptr: (const char *)&value, Size: sizeof(value_type));
40}
41
42template <>
43inline void write<float>(raw_ostream &os, float value, endianness endian) {
44 write(os, value: llvm::bit_cast<uint32_t>(from: value), endian);
45}
46
47template <>
48inline void write<double>(raw_ostream &os, double value,
49 endianness endian) {
50 write(os, value: llvm::bit_cast<uint64_t>(from: value), endian);
51}
52
53template <typename value_type>
54inline void write(raw_ostream &os, ArrayRef<value_type> vals,
55 endianness endian) {
56 for (value_type v : vals)
57 write(os, v, endian);
58}
59
60template <typename value_type>
61inline void write(SmallVectorImpl<char> &Out, value_type V, endianness E) {
62 V = byte_swap<value_type>(V, E);
63 Out.append(in_start: (const char *)&V, in_end: (const char *)&V + sizeof(value_type));
64}
65
66/// Adapter to write values to a stream in a particular byte order.
67struct Writer {
68 raw_ostream &OS;
69 endianness Endian;
70 Writer(raw_ostream &OS, endianness Endian) : OS(OS), Endian(Endian) {}
71 template <typename value_type> void write(ArrayRef<value_type> Val) {
72 endian::write(OS, Val, Endian);
73 }
74 template <typename value_type> void write(value_type Val) {
75 endian::write(OS, Val, Endian);
76 }
77};
78
79} // end namespace endian
80
81} // end namespace support
82} // end namespace llvm
83
84#endif
85

source code of llvm/include/llvm/Support/EndianStream.h