blob: 4493afe8e3243579703c7a258574a15516732b8f [file] [log] [blame]
/*
* Copyright 2015, 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 ANDROID_CAZE_POSTBUFFER_H
#define ANDROID_CAZE_POSTBUFFER_H
#include <cstdint>
#include <functional>
#include <memory>
namespace android {
namespace caze {
// PostBuffer provides a delayed-send buffer for pushing data to the server.
// This serves as an optimisation to batch many small postbacks into fewer, larger batches.
class PostBuffer {
public:
typedef std::function<bool(const void*, uint32_t)> PostBufferCallback;
// Constructs a PostBuffer with the specified maximum capacity and function to invoke when
// the PostBuffer wants to flush the buffer to the server.
PostBuffer(uint32_t desiredCapacity, PostBufferCallback callback);
~PostBuffer();
// Push data to the buffer. If the buffer does not have enough space to buffer the data, then
// the contents of the PushBuffer will be flushed.
bool push(const void* address, uint32_t count);
// Forcefully flush the PostBuffer. If the PostBuffer is empty then calling this function does
// nothing.
bool flush();
private:
// The PostBuffer's internal buffer.
const std::unique_ptr<uint8_t[]> mBuffer;
// The maximum capacity of the internal buffer.
const uint32_t mCapacity;
// The flush callback function.
const PostBufferCallback mCallback;
// The offset in mBuffer for the next write.
uint32_t mOffset;
};
} // end of namespace caze
} // end of namespace android
#endif // ANDROID_CAZE_POSTBUFFER_H