• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

bblanchon / ArduinoStreamUtils / 4332192079

pending completion
4332192079

push

github

Benoit Blanchon
Fix "__FlashStringHelper is ambiguous" with arduino-pico

840 of 853 relevant lines covered (98.48%)

1269.0 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

95.12
/src/StreamUtils/Policies/ReadBufferingPolicy.hpp
1
// StreamUtils - github.com/bblanchon/ArduinoStreamUtils
2
// Copyright Benoit Blanchon 2019-2023
3
// MIT License
4

5
#pragma once
6

7
#include <Stream.h>
8

9
#include "../Buffers/LinearBuffer.hpp"
10
#include "../Helpers.hpp"
11

12
namespace StreamUtils {
13

14
template <typename TAllocator>
15
struct ReadBufferingPolicy {
16
  ReadBufferingPolicy(size_t capacity, TAllocator allocator = TAllocator())
440✔
17
      : _buffer(capacity, allocator) {}
440✔
18

19
  ReadBufferingPolicy(const ReadBufferingPolicy &other)
460✔
20
      : _buffer(other._buffer) {}
460✔
21

22
  int available(Stream &stream) {
100✔
23
    return static_cast<int>(stream.available() + _buffer.available());
100✔
24
  }
25

26
  template <typename TTarget>  // Stream or Client
27
  int read(TTarget &target) {
662✔
28
    if (!_buffer)
662✔
29
      return target.read();
62✔
30

31
    if (_buffer.available() > 0)
600✔
32
      return _buffer.read();
302✔
33

34
    size_t avail = static_cast<size_t>(target.available());
298✔
35
    if (avail <= 1)
298✔
36
      return target.read();
82✔
37

38
    _buffer.reloadFrom(target, avail);
216✔
39
    return _buffer.read();
216✔
40
  }
41

42
  int peek(Stream &stream) {
80✔
43
    return isEmpty() ? stream.peek() : _buffer.peek();
80✔
44
  }
45

46
  size_t readBytes(Stream &stream, char *buffer, size_t size) {
72✔
47
    return doReadBytes(stream, buffer, size);
72✔
48
  }
49

50
  int read(Client &client, uint8_t *buffer, size_t size) {
×
51
    return static_cast<int>(
52
        doReadBytes(client, reinterpret_cast<char *>(buffer), size));
×
53
  }
54

55
 private:
56
  bool isEmpty() const {
80✔
57
    return _buffer.available() == 0;
80✔
58
  }
59

60
  LinearBuffer<TAllocator> _buffer;
61

62
  template <typename TTarget>  // Stream or Client
63
  size_t doReadBytes(TTarget &target, char *buffer, size_t size) {
72✔
64
    if (!_buffer)
72✔
65
      return readOrReadBytes(target, buffer, size);
6✔
66

67
    size_t result = 0;
66✔
68

69
    // can we read from buffer?
70
    if (_buffer.available() > 0) {
66✔
71
      size_t bytesRead = _buffer.readBytes(buffer, size);
36✔
72
      result += bytesRead;
36✔
73
      buffer += bytesRead;
36✔
74
      size -= bytesRead;
36✔
75
    }
76

77
    // still something to read?
78
    if (size > 0) {
66✔
79
      // (at this point, the buffer is empty)
80

81
      size_t avail = static_cast<size_t>(target.available());
42✔
82

83
      // should we use the buffer?
84
      if (avail > size && size < _buffer.capacity()) {
42✔
85
        _buffer.reloadFrom(target, avail);
18✔
86
        size_t bytesRead = _buffer.readBytes(buffer, size);
18✔
87
        result += bytesRead;
18✔
88
      } else {
89
        // we can bypass the buffer
90
        result += readOrReadBytes(target, buffer, size);
24✔
91
      }
92
    }
93

94
    return result;
66✔
95
  }
96
};  // namespace StreamUtils
97

98
}  // namespace StreamUtils
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc