Coverage Report

Created: 2025-11-16 09:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/include/o3tl/vector_pool.hxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 * This file incorporates work covered by the following license notice:
10
 *
11
 *   Licensed to the Apache Software Foundation (ASF) under one or more
12
 *   contributor license agreements. See the NOTICE file distributed
13
 *   with this work for additional information regarding copyright
14
 *   ownership. The ASF licenses this file to you under the Apache
15
 *   License, Version 2.0 (the "License"); you may not use this file
16
 *   except in compliance with the License. You may obtain a copy of
17
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
18
 */
19
20
#ifndef INCLUDED_O3TL_VECTOR_POOL_HXX
21
#define INCLUDED_O3TL_VECTOR_POOL_HXX
22
23
#include <utility>
24
#include <vector>
25
26
namespace o3tl
27
{
28
    namespace detail
29
    {
30
        template<typename ValueType, class Container> class simple_pool_impl :
31
            public Container
32
        {
33
            typedef typename Container::value_type value_type;
34
            std::ptrdiff_t mnFirstFreeIndex;
35
36
        public:
37
            simple_pool_impl() :
38
0
                mnFirstFreeIndex(-1)
39
0
            {}
40
41
            std::ptrdiff_t alloc()
42
0
            {
43
0
                return store(ValueType());
44
0
            }
45
46
            std::ptrdiff_t store(const ValueType& rCopy)
47
0
            {
48
0
                if( mnFirstFreeIndex != -1 )
49
0
                {
50
0
                    std::ptrdiff_t nIdx=mnFirstFreeIndex;
51
0
                    mnFirstFreeIndex = this->at(mnFirstFreeIndex).nextFree;
52
0
                    this->at(nIdx).value = rCopy;
53
0
                    this->at(nIdx).nextFree = -1;
54
55
0
                    return nIdx;
56
0
                }
57
0
                else
58
0
                {
59
0
                    this->push_back(value_type(rCopy));
60
0
                    return this->size()-1;
61
0
                }
62
0
            }
63
64
            void free( std::ptrdiff_t nIdx )
65
0
            {
66
0
                this->at(nIdx).nextFree = mnFirstFreeIndex;
67
0
                mnFirstFreeIndex = nIdx;
68
0
            }
69
70
            const ValueType& get( std::ptrdiff_t nIdx ) const
71
            {
72
                return this->operator[](nIdx).value;
73
            }
74
            ValueType& get( std::ptrdiff_t nIdx )
75
0
            {
76
0
                return this->operator[](nIdx).value;
77
0
            }
78
        };
79
80
        template< typename ValueType > struct struct_from_value
81
        {
82
            struct type
83
            {
84
                type() :
85
                    value(),
86
                    nextFree(-1)
87
                {}
88
                explicit type( ValueType val ) :
89
0
                    value(std::move(val)),
90
0
                    nextFree(-1)
91
0
                {}
92
93
                ValueType      value;
94
                std::ptrdiff_t nextFree;
95
            };
96
        };
97
    }
98
99
    /** Simple vector-based memory pool allocator
100
101
        This template can be used to provide simple pooled memory
102
        allocation from a container class that adheres to the stl
103
        random access container concept. Note that alloc/free works
104
        with _indices_ into the container!
105
106
        @example
107
        <pre>
108
vector_pool<type> myPool;
109
int nIdx=myPool.alloc();
110
myPool[nIdx] = myVal;
111
 ... do stuff ...
112
myPool.free(nIdx);
113
        </pre>
114
     */
115
    template<typename ValueType> struct vector_pool :
116
        public detail::simple_pool_impl<ValueType,
117
                                       std::vector<typename detail::struct_from_value<ValueType>::type > >
118
    {};
119
}
120
121
#endif /* INCLUDED_O3TL_VECTOR_POOL_HXX */
122
123
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */