| Index: cc/base/list_container_helper.h
|
| diff --git a/cc/base/list_container_helper.h b/cc/base/list_container_helper.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..fb953a69456ba73a88893e3176670c357276dd90
|
| --- /dev/null
|
| +++ b/cc/base/list_container_helper.h
|
| @@ -0,0 +1,175 @@
|
| +// Copyright 2015 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 CC_BASE_LIST_CONTAINER_HELPER_H_
|
| +#define CC_BASE_LIST_CONTAINER_HELPER_H_
|
| +
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "cc/base/cc_export.h"
|
| +
|
| +namespace cc {
|
| +
|
| +// Helper class for ListContainer non-templated logic. All methods are private,
|
| +// and only exposed to friend classes.
|
| +// For usage, see comments in ListContainer (list_container.h).
|
| +class CC_EXPORT ListContainerHelper final {
|
| + private:
|
| + template <typename T>
|
| + friend class ListContainer;
|
| +
|
| + explicit ListContainerHelper(size_t max_size_for_derived_class);
|
| + ListContainerHelper(size_t max_size_for_derived_class,
|
| + size_t num_of_elements_to_reserve_for);
|
| + ~ListContainerHelper();
|
| +
|
| + // This class deals only with char* and void*. It does allocation and passing
|
| + // out raw pointers, as well as memory deallocation when being destroyed.
|
| + class CharAllocator;
|
| +
|
| + // This class points to a certain position inside memory of
|
| + // CharAllocator. It is a base class for ListContainer iterators.
|
| + struct CC_EXPORT PositionInCharAllocator {
|
| + CharAllocator* ptr_to_container;
|
| + size_t vector_index;
|
| + char* item_iterator;
|
| +
|
| + PositionInCharAllocator(const PositionInCharAllocator& other);
|
| +
|
| + PositionInCharAllocator(CharAllocator* container,
|
| + size_t vector_ind,
|
| + char* item_iter);
|
| +
|
| + bool operator==(const PositionInCharAllocator& other) const;
|
| + bool operator!=(const PositionInCharAllocator& other) const;
|
| +
|
| + PositionInCharAllocator Increment();
|
| + PositionInCharAllocator ReverseIncrement();
|
| + };
|
| +
|
| + // Iterator classes that can be used to access data.
|
| + /////////////////////////////////////////////////////////////////
|
| + class CC_EXPORT Iterator : public PositionInCharAllocator {
|
| + // This class is only defined to forward iterate through
|
| + // CharAllocator.
|
| + public:
|
| + Iterator(CharAllocator* container,
|
| + size_t vector_ind,
|
| + char* item_iter,
|
| + size_t index);
|
| + ~Iterator();
|
| +
|
| + size_t index() const;
|
| +
|
| + protected:
|
| + // This is used to track how many increment has happened since begin(). It
|
| + // is used to avoid double increment at places an index reference is
|
| + // needed. For iterator this means begin() corresponds to index 0 and end()
|
| + // corresponds to index |size|.
|
| + size_t index_;
|
| + };
|
| +
|
| + class CC_EXPORT ConstIterator : public PositionInCharAllocator {
|
| + // This class is only defined to forward iterate through
|
| + // CharAllocator.
|
| + public:
|
| + ConstIterator(CharAllocator* container,
|
| + size_t vector_ind,
|
| + char* item_iter,
|
| + size_t index);
|
| + ConstIterator(const Iterator& other); // NOLINT
|
| + ~ConstIterator();
|
| +
|
| + size_t index() const;
|
| +
|
| + protected:
|
| + // This is used to track how many increment has happened since begin(). It
|
| + // is used to avoid double increment at places an index reference is
|
| + // needed. For iterator this means begin() corresponds to index 0 and end()
|
| + // corresponds to index |size|.
|
| + size_t index_;
|
| + };
|
| +
|
| + class CC_EXPORT ReverseIterator : public PositionInCharAllocator {
|
| + // This class is only defined to reverse iterate through
|
| + // CharAllocator.
|
| + public:
|
| + ReverseIterator(CharAllocator* container,
|
| + size_t vector_ind,
|
| + char* item_iter,
|
| + size_t index);
|
| + ~ReverseIterator();
|
| +
|
| + size_t index() const;
|
| +
|
| + protected:
|
| + // This is used to track how many increment has happened since rbegin(). It
|
| + // is used to avoid double increment at places an index reference is
|
| + // needed. For reverse iterator this means rbegin() corresponds to index 0
|
| + // and rend() corresponds to index |size|.
|
| + size_t index_;
|
| + };
|
| +
|
| + class CC_EXPORT ConstReverseIterator : public PositionInCharAllocator {
|
| + // This class is only defined to reverse iterate through
|
| + // CharAllocator.
|
| + public:
|
| + ConstReverseIterator(CharAllocator* container,
|
| + size_t vector_ind,
|
| + char* item_iter,
|
| + size_t index);
|
| + ConstReverseIterator(const ReverseIterator& other); // NOLINT
|
| + ~ConstReverseIterator();
|
| +
|
| + size_t index() const;
|
| +
|
| + protected:
|
| + // This is used to track how many increment has happened since rbegin(). It
|
| + // is used to avoid double increment at places an index reference is
|
| + // needed. For reverse iterator this means rbegin() corresponds to index 0
|
| + // and rend() corresponds to index |size|.
|
| + size_t index_;
|
| + };
|
| +
|
| + // Unlike the ListContainer methods, these do not invoke element destructors.
|
| + void RemoveLast();
|
| + void EraseAndInvalidateAllPointers(Iterator* position);
|
| + void InsertBeforeAndInvalidateAllPointers(Iterator* position,
|
| + size_t number_of_elements);
|
| +
|
| + ConstReverseIterator crbegin() const;
|
| + ConstReverseIterator crend() const;
|
| + ReverseIterator rbegin();
|
| + ReverseIterator rend();
|
| + ConstIterator cbegin() const;
|
| + ConstIterator cend() const;
|
| + Iterator begin();
|
| + Iterator end();
|
| +
|
| + Iterator IteratorAt(size_t index);
|
| + ConstIterator IteratorAt(size_t index) const;
|
| +
|
| + size_t size() const;
|
| + bool empty() const;
|
| +
|
| + size_t MaxSizeForDerivedClass() const;
|
| +
|
| + size_t GetCapacityInBytes() const;
|
| +
|
| + // Unlike the ListContainer method, this one does not invoke element
|
| + // destructors.
|
| + void clear();
|
| +
|
| + size_t AvailableSizeWithoutAnotherAllocationForTesting() const;
|
| +
|
| + // Hands out memory location for an element at the end of data structure.
|
| + void* Allocate(size_t size_of_actual_element_in_bytes);
|
| +
|
| + scoped_ptr<CharAllocator> data_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ListContainerHelper);
|
| +};
|
| +
|
| +} // namespace cc
|
| +
|
| +#endif // CC_BASE_LIST_CONTAINER_HELPER_H_
|
|
|