Disk ARchive
2.8.5
Full featured and portable backup and archiving tool
Toggle main menu visibility
Loading...
Searching...
No Matches
src
libdar
heap.hpp
Go to the documentation of this file.
1
/*********************************************************************/
2
// dar - disk archive - a backup/restoration program
3
// Copyright (C) 2002-2026 Denis Corbin
4
//
5
// This program is free software; you can redistribute it and/or
6
// modify it under the terms of the GNU General Public License
7
// as published by the Free Software Foundation; either version 2
8
// of the License, or (at your option) any later version.
9
//
10
// This program is distributed in the hope that it will be useful,
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
// GNU General Public License for more details.
14
//
15
// You should have received a copy of the GNU General Public License
16
// along with this program; if not, write to the Free Software
17
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
//
19
// to contact the author, see the AUTHOR file
20
/*********************************************************************/
21
26
27
#ifndef HEAP_HPP
28
#define HEAP_HPP
29
30
#include "
../my_config.h
"
31
#include <string>
32
33
#include "
integers.hpp
"
34
#include <memory>
35
#include <deque>
36
#if HAVE_LIBTHREADAR_LIBTHREADAR_HPP
37
#include <libthreadar/libthreadar.hpp>
38
#endif
39
40
namespace
libdar
41
{
42
45
47
48
template
<
class
T>
class
heap
49
{
50
public
:
51
heap() {};
// start with an empty heap
52
heap(
const
heap & ref) =
delete
;
53
heap(heap && ref) =
default
;
54
heap & operator = (
const
heap & ref) =
delete
;
55
heap & operator = (heap && ref)
noexcept
=
default
;
56
57
std::unique_ptr<T> get();
58
void
put(std::unique_ptr<T> && obj);
59
void
put(std::deque<std::unique_ptr<T> > & list);
60
U_I get_size()
const
{
return
tas.size(); };
61
62
private
:
63
std::deque<std::unique_ptr<T> > tas;
64
#ifdef LIBTHREADAR_AVAILABLE
65
libthreadar::mutex access;
66
#endif
67
};
68
69
template
<
class
T> std::unique_ptr<T> heap<T>::get()
70
{
71
std::unique_ptr<T> ret;
72
73
#ifdef LIBTHREADAR_AVAILABLE
74
access.lock();
75
try
76
{
77
#endif
78
79
if
(tas.empty())
80
throw
Erange
(
"heap::get"
,
"heap is empty, it should have be set larger"
);
81
82
ret = std::move(tas.back());
// moving the object pointed to by tas.back() to ret
83
tas.pop_back();
// removing the now empty pointer at the end of 'tas'
84
85
#ifdef LIBTHREADAR_AVAILABLE
86
}
87
catch
(...)
88
{
89
access.unlock();
90
throw
;
91
}
92
access.unlock();
93
#endif
94
95
return
ret;
96
}
97
98
template
<
class
T>
void
heap<T>::put(std::unique_ptr<T> && obj)
99
{
100
#ifdef LIBTHREADAR_AVAILABLE
101
access.lock();
102
try
103
{
104
#endif
105
106
tas.push_back(std::move(obj));
107
108
#ifdef LIBTHREADAR_AVAILABLE
109
}
110
catch
(...)
111
{
112
access.unlock();
113
throw
;
114
}
115
access.unlock();
116
#endif
117
}
118
119
template
<
class
T>
void
heap<T>::put(std::deque<std::unique_ptr<T> > & list)
120
{
121
typename
std::deque<std::unique_ptr<T> >::iterator it = list.begin();
122
123
#ifdef LIBTHREADAR_AVAILABLE
124
access.lock();
125
try
126
{
127
#endif
128
129
while
(it != list.end())
130
{
131
tas.push_back(std::move(*it));
132
++it;
133
}
134
135
#ifdef LIBTHREADAR_AVAILABLE
136
}
137
catch
(...)
138
{
139
access.unlock();
140
throw
;
141
}
142
access.unlock();
143
#endif
144
}
145
147
148
}
// end of namespace
149
150
#endif
libdar::Erange
exception used to signal range error
Definition
erreurs.hpp:220
integers.hpp
are defined here basic integer types that tend to be portable
my_config.h
include macro defined by the configure script and some specific additional ones
libdar
libdar namespace encapsulate all libdar symbols
Definition
archive.hpp:47
Generated on
for Disk ARchive by
1.17.0