blob: be98b0a7f3991cb425c4dbd40785bcffc7e1d905 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SKY_ENGINE_WTF_DOUBLEBUFFEREDDEQUE_H_
#define SKY_ENGINE_WTF_DOUBLEBUFFEREDDEQUE_H_
#include "sky/engine/wtf/Deque.h"
#include "sky/engine/wtf/Noncopyable.h"
namespace WTF {
// A helper class for managing double buffered deques, typically where the client locks when appending or swapping.
template <typename T> class DoubleBufferedDeque {
WTF_MAKE_NONCOPYABLE(DoubleBufferedDeque);
public:
DoubleBufferedDeque()
: m_activeIndex(0) { }
void append(const T& value)
{
m_queue[m_activeIndex].append(value);
}
bool isEmpty() const
{
return m_queue[m_activeIndex].isEmpty();
}
Deque<T>& swapBuffers()
{
int oldIndex = m_activeIndex;
m_activeIndex ^= 1;
ASSERT(m_queue[m_activeIndex].isEmpty());
return m_queue[oldIndex];
}
private:
Deque<T> m_queue[2];
int m_activeIndex;
};
} // namespace WTF
using WTF::DoubleBufferedDeque;
#endif // SKY_ENGINE_WTF_DOUBLEBUFFEREDDEQUE_H_