]> granicus.if.org Git - icinga2/blob - lib/base/fifo.hpp
Merge pull request #7185 from Icinga/bugfix/gelfwriter-wrong-log-facility
[icinga2] / lib / base / fifo.hpp
1 /* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */
2
3 #ifndef FIFO_H
4 #define FIFO_H
5
6 #include "base/i2-base.hpp"
7 #include "base/stream.hpp"
8
9 namespace icinga
10 {
11
12 /**
13  * A byte-based FIFO buffer.
14  *
15  * @ingroup base
16  */
17 class FIFO final : public Stream
18 {
19 public:
20         DECLARE_PTR_TYPEDEFS(FIFO);
21
22         static const size_t BlockSize = 512;
23
24         ~FIFO() override;
25
26         size_t Peek(void *buffer, size_t count, bool allow_partial = false) override;
27         size_t Read(void *buffer, size_t count, bool allow_partial = false) override;
28         void Write(const void *buffer, size_t count) override;
29         void Close() override;
30         bool IsEof() const override;
31         bool SupportsWaiting() const override;
32         bool IsDataAvailable() const override;
33
34         size_t GetAvailableBytes() const;
35
36 private:
37         char *m_Buffer{nullptr};
38         size_t m_DataSize{0};
39         size_t m_AllocSize{0};
40         size_t m_Offset{0};
41
42         void ResizeBuffer(size_t newSize, bool decrease);
43         void Optimize();
44 };
45
46 }
47
48 #endif /* FIFO_H */