C++ Utilities  5.10.5
Useful C++ classes and routines such as argument parser, IO and conversion utilities
nativefilestream.h
Go to the documentation of this file.
1 #ifndef IOUTILITIES_NATIVE_FILE_STREAM
2 #define IOUTILITIES_NATIVE_FILE_STREAM
3 
4 #include "../global.h"
5 
6 #ifdef CPP_UTILITIES_USE_NATIVE_FILE_BUFFER
7 #include <iostream>
8 #include <memory>
9 #include <streambuf>
10 #include <string>
11 #endif
12 #include <fstream>
13 
14 namespace CppUtilities {
15 
16 #ifdef CPP_UTILITIES_USE_NATIVE_FILE_BUFFER
17 
18 class CPP_UTILITIES_EXPORT NativeFileStream : public std::iostream {
19 public:
20 #ifdef PLATFORM_WINDOWS
21  using Handle = void *;
22 #endif
23  struct CPP_UTILITIES_EXPORT FileBuffer {
24  FileBuffer(std::basic_streambuf<char> *buffer);
25  FileBuffer(const std::string &path, ios_base::openmode openMode);
26  FileBuffer(int fileDescriptor, ios_base::openmode openMode);
27 
28  std::unique_ptr<std::basic_streambuf<char>> buffer;
29 #ifdef PLATFORM_WINDOWS
30  Handle handle = nullptr;
31 #endif
32  int descriptor = -1;
33  };
34 
36  NativeFileStream(const std::string &path, std::ios_base::openmode openMode);
37  NativeFileStream(int fileDescriptor, std::ios_base::openmode openMode);
39  ~NativeFileStream() override;
40 
41  bool is_open() const;
42  bool isOpen() const;
43  void open(const std::string &path, std::ios_base::openmode openMode);
44  void open(int fileDescriptor, std::ios_base::openmode openMode);
45  void close();
46  int fileDescriptor();
47 #ifdef PLATFORM_WINDOWS
48  Handle fileHandle();
49  static std::unique_ptr<wchar_t[]> makeWidePath(const std::string &path);
50 #endif
51 
52 private:
53  void setData(FileBuffer data, std::ios_base::openmode openMode);
54 
55  FileBuffer m_data;
56  std::ios_base::openmode m_openMode;
57 };
58 
62 inline NativeFileStream::NativeFileStream(const std::string &path, ios_base::openmode openMode)
64 {
65  open(path, openMode);
66 }
67 
71 inline NativeFileStream::NativeFileStream(int fileDescriptor, ios_base::openmode openMode)
73 {
74  open(fileDescriptor, openMode);
75 }
76 
81 inline int NativeFileStream::fileDescriptor()
82 {
83  return m_data.descriptor;
84 }
85 
86 #ifdef PLATFORM_WINDOWS
91 inline NativeFileStream::Handle NativeFileStream::fileHandle()
92 {
93  return m_data.handle;
94 }
95 #endif
96 
101 inline bool NativeFileStream::is_open() const
102 {
103  return isOpen();
104 }
105 
106 #else // CPP_UTILITIES_USE_NATIVE_FILE_BUFFER
107 
108 using NativeFileStream = std::fstream;
109 
110 #endif
111 
112 } // namespace CppUtilities
113 
114 #endif // IOUTILITIES_NATIVE_FILE_STREAM
#define CPP_UTILITIES_EXPORT
Marks the symbol to be exported by the c++utilities library.
Contains all utilities provides by the c++utilities library.
std::fstream NativeFileStream