blob: 903ce6545c61b19b2eade7f9a9910150e027842d [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef GAPIR_RESOURCE_CACHE_H
#define GAPIR_RESOURCE_CACHE_H
#include "resource_provider.h"
#include <memory>
#include <vector>
namespace gapir {
// ResourceCache is an abstract base class for caching resource providers.
class ResourceCache : public ResourceProvider {
public:
ResourceCache(std::unique_ptr<ResourceProvider> fallbackProvider);
// Loads count resources from the provider and writes them, in-order, to target.
// If the net size of all the resources exceeds size, then false is returned.
bool get(const Resource* resources, size_t count, const ServerConnection& server,
void* target, size_t size) override;
protected:
virtual void putCache(const Resource& resource, const void* data) = 0;
virtual bool getCache(const Resource& resource, void* data) = 0;
// Fall back resource provider for the cases when the requested resource is not in the cache.
std::unique_ptr<ResourceProvider> mFallbackProvider;
// Batch is a helper class for accumulating resources to request on the fallback provider.
class Batch {
public:
// Constructor.
// target is the pointer to the memory to hold the fetched resources on calling flush.
// size is the size in bytes of the buffer at target.
Batch(void* target, size_t size);
// append adds the resource to the batch.
// Returns true if the resource fits in the remaining buffer space, otherwise false.
bool append(const Resource& resource);
// flush requests the resources appended to the Batch from the fallback provider.
// The requested resources are added to the cache using putCache.
// Once called, the batch must not be used again.
// Returns true if all resources were fetched, otherwise false.
bool flush(ResourceCache& cache, const ServerConnection& server);
private:
std::vector<Resource> mResources; // Batch of resources to request.
uint8_t* mTarget; // Target address of resource data.
size_t mSize; // Target buffer size.
size_t mSpace; // mSize - size of all resources in batch.
};
};
} // namespace gapir
#endif // GAPIR_RESOURCE_CACHE_H