Cogs.Core
RasterSourceSubscription.cpp
1#include "RasterSourceSubscription.h"
2
3Cogs::RasterSourceSubscription::RasterSourceSubscription(RasterSourceSubscription && other)
4{
5 std::lock_guard<std::mutex> lock(other.responseMutex);
6
7 std::swap(rasterSource, other.rasterSource);
8 std::swap(responses, other.responses);
9}
10
11void Cogs::RasterSourceSubscription::setup(RasterSourcePtr source)
12{
13 assert(!rasterSource && "Raster source already setup.");
14
15 std::lock_guard<std::mutex> lock(source->subscriberMutex);
16
17 source->addSubscriber(this);
18
19 rasterSource = source;
20}
21
22void Cogs::RasterSourceSubscription::teardown()
23{
24 if (rasterSource) {
25 std::lock_guard<std::mutex> lock(rasterSource->subscriberMutex);
26
27 rasterSource->removeSubscriber(this);
28 }
29
30 rasterSource.reset();
31}
32
33void Cogs::RasterSourceSubscription::postResponse(const TileLoadResponse & response)
34{
35 std::lock_guard<std::mutex> lock(responseMutex);
36
37 responses.push_back(response);
38}
39
40void Cogs::RasterSourceSubscription::getResponses(std::vector<TileLoadResponse> & results, size_t maxResponses)
41{
42 std::lock_guard<std::mutex> lock(responseMutex);
43
44 if (responses.size() < maxResponses) {
45 std::swap(responses, results);
46 } else {
47 results.reserve(maxResponses);
48
49 auto i = maxResponses;
50 while (i--) {
51 results.push_back(responses.back());
52 responses.pop_back();
53 }
54 }
55}