28 jassert (bufferSize > 0);
38 auto vs = validStart.
get();
39 auto ve = validEnd.
get();
40 return ve >= vs ? (ve - vs) : (bufferSize - (vs - ve));
51 jassert (newSize > 0);
58 int& startIndex2,
int& blockSize2)
const noexcept
60 auto vs = validStart.get();
61 auto ve = validEnd.get();
63 auto freeSpace = ve >= vs ? (bufferSize - (ve - vs)) : (vs - ve);
64 numToWrite = jmin (numToWrite, freeSpace - 1);
77 blockSize1 = jmin (bufferSize - ve, numToWrite);
78 numToWrite -= blockSize1;
79 blockSize2 = numToWrite <= 0 ? 0 : jmin (numToWrite, vs);
85 jassert (numWritten >= 0 && numWritten < bufferSize);
87 auto newEnd = validEnd.get() + numWritten;
89 if (newEnd >= bufferSize)
96 int& startIndex2,
int& blockSize2)
const noexcept
98 auto vs = validStart.get();
99 auto ve = validEnd.get();
101 auto numReady = ve >= vs ? (ve - vs) : (bufferSize - (vs - ve));
102 numWanted = jmin (numWanted, numReady);
115 blockSize1 = jmin (bufferSize - vs, numWanted);
116 numWanted -= blockSize1;
117 blockSize2 = numWanted <= 0 ? 0 : jmin (numWanted, ve);
123 jassert (numRead >= 0 && numRead <= bufferSize);
125 auto newStart = validStart.get() + numRead;
127 if (newStart >= bufferSize)
128 newStart -= bufferSize;
130 validStart = newStart;
134 template <AbstractFifo::ReadOrWrite mode>
136 : startIndex1 (other.startIndex1),
137 blockSize1 (other.blockSize1),
138 startIndex2 (other.startIndex2),
139 blockSize2 (other.blockSize2)
144 template <AbstractFifo::ReadOrWrite mode>
145 AbstractFifo::ScopedReadWrite<mode>&
146 AbstractFifo::ScopedReadWrite<mode>::operator= (ScopedReadWrite&& other) noexcept
152 template <AbstractFifo::ReadOrWrite mode>
153 void AbstractFifo::ScopedReadWrite<mode>::swap (ScopedReadWrite& other) noexcept
155 std::swap (other.fifo, fifo);
156 std::swap (other.startIndex1, startIndex1);
157 std::swap (other.blockSize1, blockSize1);
158 std::swap (other.startIndex2, startIndex2);
159 std::swap (other.blockSize2, blockSize2);
162 template class AbstractFifo::ScopedReadWrite<AbstractFifo::ReadOrWrite::read>;
163 template class AbstractFifo::ScopedReadWrite<AbstractFifo::ReadOrWrite::write>;
172 class AbstractFifoTests :
public UnitTest
175 AbstractFifoTests() :
UnitTest (
"Abstract Fifo",
"Containers") {}
177 struct WriteThread :
public Thread
179 WriteThread (AbstractFifo& f,
int* b, Random rng)
180 : Thread (
"fifo writer"), fifo (f), buffer (b), random (rng)
194 while (! threadShouldExit())
196 int num = random.nextInt (2000) + 1;
198 auto writer = fifo.write (num);
200 jassert (writer.blockSize1 >= 0 && writer.blockSize2 >= 0);
201 jassert (writer.blockSize1 == 0
202 || (writer.startIndex1 >= 0 && writer.startIndex1 < fifo.getTotalSize()));
203 jassert (writer.blockSize2 == 0
204 || (writer.startIndex2 >= 0 && writer.startIndex2 < fifo.getTotalSize()));
206 writer.forEach ([
this, &n] (
int index) { this->buffer[index] = n++; });
215 void runTest()
override
217 beginTest (
"AbstractFifo");
220 AbstractFifo fifo (numElementsInArray (buffer));
222 WriteThread writer (fifo, buffer, getRandom());
225 Random r = getRandom();
226 r.combineSeed (12345);
228 for (
int count = 100000; --count >= 0;)
230 int num = r.nextInt (6000) + 1;
232 auto reader = fifo.read (num);
234 if (! (reader.blockSize1 >= 0 && reader.blockSize2 >= 0)
235 && (reader.blockSize1 == 0
236 || (reader.startIndex1 >= 0 && reader.startIndex1 < fifo.getTotalSize()))
237 && (reader.blockSize2 == 0
238 || (reader.startIndex2 >= 0 && reader.startIndex2 < fifo.getTotalSize())))
240 expect (
false,
"prepareToRead returned -ve values");
246 reader.forEach ([&failed, &buffer, &n] (
int index)
248 failed = (buffer[index] != n++) || failed;
253 expect (
false,
"read values were incorrect");
260 static AbstractFifoTests fifoUnitTests;