File: binary_file_io.h

package info (click to toggle)
cgal 6.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 144,912 kB
  • sloc: cpp: 810,858; ansic: 208,477; sh: 493; python: 411; makefile: 286; javascript: 174
file content (145 lines) | stat: -rw-r--r-- 3,907 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Copyright (c) 1997
// Utrecht University (The Netherlands),
// ETH Zurich (Switzerland),
// INRIA Sophia-Antipolis (France),
// Max-Planck-Institute Saarbruecken (Germany),
// and Tel-Aviv University (Israel).  All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL: https://github.com/CGAL/cgal/blob/v6.1/Stream_support/include/CGAL/IO/binary_file_io.h $
// $Id: include/CGAL/IO/binary_file_io.h b26b07a1242 $
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
//
// Author(s)     : Lutz Kettner  <kettner@mpi-sb.mpg.de>


#ifndef CGAL_IO_BINARY_FILE_IO_H
#define CGAL_IO_BINARY_FILE_IO_H

#include <CGAL/config.h>
#include <CGAL/assertions.h>
#include <iostream>
#include <cstdint>
#include <limits>

namespace CGAL {

inline void
I_Binary_write_uinteger32(std::ostream& out, std::uint32_t u) {
    out.write( (char*)(&u), 4);
}
// Special function to write size_t in 32b integer to ensure files
// written by 64b systems are still readable by 32b ones
inline void
I_Binary_write_size_t_into_uinteger32 (std::ostream& out, std::size_t s) {
    CGAL_assertion_msg
      (s <= static_cast<std::size_t>((std::numeric_limits<std::uint32_t>::max)()),
       "Trying to write size_t that does not fit in uint32_t");
    I_Binary_write_uinteger32 (out, static_cast<std::uint32_t>(s));
}
inline void
I_Binary_write_integer32(std::ostream& out, std::int32_t i) {
    out.write( (char*)(&i), 4);
}
inline void
I_Binary_write_float32(std::ostream& out, float f) {
  out.write( (char*)(&f), 4);
}
inline void
I_Binary_write_bool(std::ostream& out, bool b) {
    char c = (b ? 1 : 0);
    out.write(&c, 1);
}

// Special function to read size_t from 32b integer to ensure files
inline void
I_Binary_read_uinteger32(std::istream& is, std::uint32_t& u) {
    is.read( (char*)(&u), 4);
}
// written by 64b systems are still readable by 32b ones
inline void
I_Binary_read_size_t_from_uinteger32(std::istream& is, std::size_t& s) {
    std::uint32_t s32;
    I_Binary_read_uinteger32 (is, s32);
    s = static_cast<std::size_t>(s32);
}
inline void
I_Binary_read_integer32(std::istream& is, std::int32_t& i) {
    is.read( (char*)(&i), 4);
}
inline void
I_Binary_read_float32(std::istream& is, float& f) {
  is.read( (char*)(&f), 4);
}
inline void
I_Binary_read_bool(std::istream& is, bool& b) {
    char c;
    is.read(&c, 1);
    b = (c != 0);
}

inline void
I_swap_to_big_endian( std::uint32_t& u) {
    (void) u;
#ifdef CGAL_LITTLE_ENDIAN
  u = ((u >> 24) | (u << 24) | ((u >> 8) & 0xff00) | ((u << 8) & 0xff0000));
#endif
}

inline void
I_swap_to_big_endian( std::int32_t& i) {
    // We need to use a union instead of the 2 lines below,
    // otherwise we get aliasing issues.
    // std::uint32_t& u = (std::uint32_t&)i;
    // I_swap_to_big_endian( u);
    union {
      std::int32_t  in;
      std::uint32_t ui;
    } u;
    u.in = i;
    I_swap_to_big_endian(u.ui);
    i = u.in;
}

inline void
I_swap_to_big_endian( float& f) {
    // We need to use a union instead of the 2 lines below,
    // otherwise we get aliasing issues.
    // std::uint32_t& u = (std::uint32_t&)f;
    // I_swap_to_big_endian( u);
    union {
      std::uint32_t ui;
      float           fl;
    } u;
    u.fl = f;
    I_swap_to_big_endian(u.ui);
    f = u.fl;
}

inline void
I_Binary_write_big_endian_integer32(std::ostream& out, std::int32_t i) {
    I_swap_to_big_endian( i);
    out.write( (char*)(&i), 4);
}
inline void
I_Binary_write_big_endian_float32(std::ostream& out, float f) {
  I_swap_to_big_endian( f);
  out.write( (char*)(&f), 4);
}

inline void
I_Binary_read_big_endian_integer32(std::istream& is, std::int32_t& i) {
    is.read( (char*)(&i), 4);
    I_swap_to_big_endian( i);
}
inline void
I_Binary_read_big_endian_float32(std::istream& is, float& f) {
  is.read( (char*)(&f), 4);
  I_swap_to_big_endian( f);
}

} //namespace CGAL

#endif // CGAL_IO_BINARY_FILE_IO_H