Disk ARchive 2.8.0
Full featured and portable backup and archiving tool
criterium.hpp
Go to the documentation of this file.
1/*********************************************************************/
2// dar - disk archive - a backup/restoration program
3// Copyright (C) 2002-2025 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
25
26#ifndef CRITERIUM_HPP
27#define CRITERIUM_HPP
28
29#include "../my_config.h"
30
31#include <deque>
32#include "erreurs.hpp"
33#include "infinint.hpp"
34
35namespace libdar
36{
37
40
42 class cat_nomme;
43
45
50
52 {
53 public:
54 criterium() {};
55 criterium(const criterium & ref) = default;
56 criterium(criterium && ref) noexcept = default;
57 criterium & operator = (const criterium & ref) = default;
58 criterium & operator = (criterium && ref) noexcept = default;
59 virtual ~criterium() noexcept(false) {};
60
62
66 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const = 0;
67
69
73 virtual criterium *clone() const = 0;
74 };
75
76 // //////////////////////////////////////////////////////////
77 // ////////// a set of criterium classes follows ////////////
78 // //////////////////////////////////////////////////////////
79
80
82
85
87 {
88 public:
91 crit_in_place_is_inode(crit_in_place_is_inode && ref) noexcept = default;
92 crit_in_place_is_inode & operator = (const crit_in_place_is_inode & ref) = default;
93 crit_in_place_is_inode & operator = (crit_in_place_is_inode && ref) noexcept = default;
94 ~crit_in_place_is_inode() = default;
95
96 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
97 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_is_inode(*this); };
98 };
99
100
102
104 {
105 public:
107 crit_in_place_is_dir(const crit_in_place_is_dir & ref) = default;
108 crit_in_place_is_dir(crit_in_place_is_dir && ref) noexcept = default;
109 crit_in_place_is_dir & operator = (const crit_in_place_is_dir & ref) = default;
110 crit_in_place_is_dir & operator = (crit_in_place_is_dir && ref) noexcept = default;
111 ~crit_in_place_is_dir() = default;
112
113 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
114 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_is_dir(*this); };
115 };
116
117
119
121 {
122 public:
124 crit_in_place_is_file(const crit_in_place_is_file & ref) = default;
125 crit_in_place_is_file(crit_in_place_is_file && ref) noexcept = default;
126 crit_in_place_is_file & operator = (const crit_in_place_is_file & ref) = default;
127 crit_in_place_is_file & operator = (crit_in_place_is_file && ref) noexcept = default;
128 ~crit_in_place_is_file() = default;
129
130 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
131 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_is_file(*this); };
132 };
133
135
137
139 {
140 public:
144 crit_in_place_is_hardlinked_inode & operator = (const crit_in_place_is_hardlinked_inode & ref) = default;
145 crit_in_place_is_hardlinked_inode & operator = (crit_in_place_is_hardlinked_inode && ref) noexcept = default;
147
148 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
149 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_is_hardlinked_inode(*this); };
150 };
151
152
156
158 {
159 public:
166
167 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
168 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_is_new_hardlinked_inode(*this); };
169 };
170
171
173
175
177 {
178 public:
179 crit_in_place_data_more_recent(const infinint & hourshift = 0) : x_hourshift(hourshift) {};
182 crit_in_place_data_more_recent & operator = (const crit_in_place_data_more_recent & ref) = default;
183 crit_in_place_data_more_recent & operator = (crit_in_place_data_more_recent && ref) noexcept = default;
185
186 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
187 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_data_more_recent(*this); };
188
189 private:
190 infinint x_hourshift;
191 };
192
193
196
198
199
201 {
202 public:
203 crit_in_place_data_more_recent_or_equal_to(const infinint & date, const infinint & hourshift = 0) : x_hourshift(hourshift), x_date(date) {};
209
210 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
211 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_data_more_recent_or_equal_to(*this); };
212
213 private:
214 infinint x_hourshift;
215 infinint x_date;
216 };
217
218
220
222
224 {
225 public:
228 crit_in_place_data_bigger(crit_in_place_data_bigger && ref) noexcept = default;
229 crit_in_place_data_bigger & operator = (const crit_in_place_data_bigger & ref) = default;
230 crit_in_place_data_bigger & operator = (crit_in_place_data_bigger && ref) noexcept = default;
231 ~crit_in_place_data_bigger() = default;
232
233 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
234 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_data_bigger(*this); };
235 };
236
237
238
241
243
245 {
246 public:
249 crit_in_place_data_saved(crit_in_place_data_saved && ref) noexcept = default;
250 crit_in_place_data_saved & operator = (const crit_in_place_data_saved & ref) = default;
251 crit_in_place_data_saved & operator = (crit_in_place_data_saved && ref) noexcept = default;
252 ~crit_in_place_data_saved() = default;
253
254 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
255 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_data_saved(*this); };
256 };
257
258
260
262 {
263 public:
266 crit_in_place_data_dirty(crit_in_place_data_dirty && ref) noexcept = default;
267 crit_in_place_data_dirty & operator = (const crit_in_place_data_dirty & ref) = default;
268 crit_in_place_data_dirty & operator = (crit_in_place_data_dirty && ref) noexcept = default;
269 ~crit_in_place_data_dirty() = default;
270
271 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
272 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_data_dirty(*this); };
273 };
274
276
278 {
279 public:
282 crit_in_place_data_sparse(crit_in_place_data_sparse && ref) noexcept = default;
283 crit_in_place_data_sparse & operator = (const crit_in_place_data_sparse & ref) = default;
284 crit_in_place_data_sparse & operator = (crit_in_place_data_sparse && ref) noexcept = default;
285 ~crit_in_place_data_sparse() = default;
286
287 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
288 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_data_sparse(*this); };
289 };
290
291
293
295 {
296 public:
300 crit_in_place_has_delta_sig & operator = (const crit_in_place_has_delta_sig & ref) = default;
301 crit_in_place_has_delta_sig & operator = (crit_in_place_has_delta_sig && ref) noexcept = default;
303
304 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
305 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_has_delta_sig(*this); };
306 };
307
308 class crit_in_place_is_binary_patch : public criterium
309 {
310 public:
311 crit_in_place_is_binary_patch() {};
312 crit_in_place_is_binary_patch(const crit_in_place_is_binary_patch & ref) = default;
313 crit_in_place_is_binary_patch(crit_in_place_is_binary_patch && ref) noexcept = default;
314 crit_in_place_is_binary_patch & operator = (const crit_in_place_is_binary_patch & ref) = default;
315 crit_in_place_is_binary_patch & operator = (crit_in_place_is_binary_patch && ref) noexcept = default;
316 ~crit_in_place_is_binary_patch() = default;
317
318 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
319 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_is_binary_patch(*this); };
320 };
321
323
333
335 {
336 public:
338 crit_same_inode_data(const crit_same_inode_data & ref) = default;
339 crit_same_inode_data(crit_same_inode_data && ref) noexcept = default;
340 crit_same_inode_data & operator = (const crit_same_inode_data & ref) = default;
341 crit_same_inode_data & operator = (crit_same_inode_data && ref) noexcept = default;
342 ~crit_same_inode_data() = default;
343
344 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
345 virtual criterium *clone() const override { return new (std::nothrow) crit_same_inode_data(*this); };
346 };
347
348
351
353 {
354 public:
357 crit_in_place_EA_present(crit_in_place_EA_present && ref) noexcept = default;
358 crit_in_place_EA_present & operator = (const crit_in_place_EA_present & ref) = default;
359 crit_in_place_EA_present & operator = (crit_in_place_EA_present && ref) noexcept = default;
360 ~crit_in_place_EA_present() = default;
361
362 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
363 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_EA_present(*this); };
364 };
365
366
368
373
375 {
376 public:
377 crit_in_place_EA_more_recent(const infinint & hourshift = 0) : x_hourshift(hourshift) {};
380 crit_in_place_EA_more_recent & operator = (const crit_in_place_EA_more_recent & ref) = default;
381 crit_in_place_EA_more_recent & operator = (crit_in_place_EA_more_recent && ref) noexcept = default;
383
384
385 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
386 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_EA_more_recent(*this); };
387
388 private:
389 infinint x_hourshift;
390 };
391
392
394
397
399 {
400 public:
401 crit_in_place_EA_more_recent_or_equal_to(const infinint & date, const infinint & hourshift = 0) : x_hourshift(hourshift), x_date(date) {};
407
408 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
409 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_EA_more_recent_or_equal_to(*this); };
410
411 private:
412 infinint x_hourshift;
413 infinint x_date;
414 };
415
416
418
420
422 {
423 public:
425 crit_in_place_more_EA(const crit_in_place_more_EA & ref) = default;
426 crit_in_place_more_EA(crit_in_place_more_EA && ref) noexcept = default;
427 crit_in_place_more_EA & operator = (const crit_in_place_more_EA & ref) = default;
428 crit_in_place_more_EA & operator = (crit_in_place_more_EA && ref) noexcept = default;
429 ~crit_in_place_more_EA() = default;
430
431 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
432 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_more_EA(*this); };
433 };
434
435
436
438
440
442 {
443 public:
446 crit_in_place_EA_bigger(crit_in_place_EA_bigger && ref) noexcept = default;
447 crit_in_place_EA_bigger & operator = (const crit_in_place_EA_bigger & ref) = default;
448 crit_in_place_EA_bigger & operator = (crit_in_place_EA_bigger && ref) noexcept = default;
449 ~crit_in_place_EA_bigger() = default;
450
451 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
452 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_EA_bigger(*this); };
453 };
454
455
457
459
461 {
462 public:
464 crit_in_place_EA_saved(const crit_in_place_EA_saved & ref) = default;
465 crit_in_place_EA_saved(crit_in_place_EA_saved && ref) noexcept = default;
466 crit_in_place_EA_saved & operator = (const crit_in_place_EA_saved & ref) = default;
467 crit_in_place_EA_saved & operator = (crit_in_place_EA_saved && ref) noexcept = default;
468 ~crit_in_place_EA_saved() = default;
469
470 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
471 virtual criterium *clone() const override { return new (std::nothrow) crit_in_place_EA_saved(*this); };
472 };
473
474
476
479
481 {
482 public:
483 crit_same_type() {};
484 crit_same_type(const crit_same_type & ref) = default;
485 crit_same_type(crit_same_type && ref) noexcept = default;
486 crit_same_type & operator = (const crit_same_type & ref) = default;
487 crit_same_type & operator = (crit_same_type && ref) noexcept = default;
488 ~crit_same_type() = default;
489
490 virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override;
491 virtual criterium *clone() const override { return new (std::nothrow) crit_same_type(*this); };
492 };
493
494
496
497 class crit_not : public criterium
498 {
499 public:
500 crit_not(const criterium & crit) { x_crit = crit.clone(); if(x_crit == nullptr) throw Ememory("crit_not::crit_not"); };
501 crit_not(const crit_not & ref): criterium(ref) { copy_from(ref); };
502 crit_not(crit_not && ref) noexcept: criterium(std::move(ref)) { x_crit = nullptr; std::swap(x_crit, ref.x_crit); };
503 crit_not & operator = (const crit_not & ref) { destroy(); copy_from(ref); return *this; };
504 crit_not & operator = (crit_not && ref) noexcept { criterium::operator = (std::move(ref)); std::swap(x_crit, ref.x_crit); return *this; };
505 ~crit_not() { destroy(); };
506
507 virtual bool evaluate(const cat_nomme & first, const cat_nomme & second) const override { return ! x_crit->evaluate(first, second); };
508 virtual criterium *clone() const override { return new (std::nothrow) crit_not(*this); };
509
510 protected:
511 const criterium *x_crit;
512
513 private:
514 void copy_from(const crit_not & ref);
515 void destroy() { if(x_crit != nullptr) { delete x_crit; x_crit = nullptr; } };
516 };
517
519
520 class crit_and : public criterium
521 {
522 public:
523 crit_and() { clear(); };
524 crit_and(const crit_and & ref) : criterium(ref) { copy_from(ref); };
525 crit_and(crit_and && ref) = default; // moving the deque<criterium *> while the pointed to object are untouched
526 crit_and & operator = (const crit_and & ref) { detruit(); copy_from(ref); return *this; };
527 crit_and & operator = (crit_and && ref) noexcept = default; // moving the deque<criterium *> while the pointed to object are untouched
528 ~crit_and() { detruit(); };
529
530 void add_crit(const criterium & ref);
531 void clear() { detruit(); };
532
534 void gobe(crit_and & to_be_voided);
535
536 virtual bool evaluate(const cat_nomme & first, const cat_nomme & second) const override;
537 virtual criterium *clone() const override { return new (std::nothrow) crit_and(*this); };
538
539 protected:
540 std::deque<criterium *> operand;
541
542 private:
543 void copy_from(const crit_and & ref);
544 void detruit();
545 };
546
547 class crit_or : public crit_and
548 {
549 public:
550 crit_or() { clear(); };
551 crit_or(const crit_or & ref) = default;
552 crit_or(crit_or && ref) = default;
553 crit_or & operator = (const crit_or & ref) = default;
554 crit_or & operator = (crit_or && ref) noexcept = default;
555 ~crit_or() = default;
556
557 virtual bool evaluate(const cat_nomme & first, const cat_nomme & second) const override;
558 virtual criterium *clone() const override { return new (std::nothrow) crit_or(*this); };
559
560 };
561
562 class crit_invert : public crit_not
563 {
564 public:
565 crit_invert(const criterium & crit) : crit_not(crit) {};
566 crit_invert(const crit_invert & ref) = default;
567 crit_invert(crit_invert && ref) noexcept = default;
568 crit_invert & operator = (const crit_invert & ref) = default;
569 crit_invert & operator = (crit_invert && ref) noexcept = default;
570 ~crit_invert() = default;
571
572 virtual bool evaluate(const cat_nomme & first, const cat_nomme & second) const override { return x_crit->evaluate(second, first); };
573 virtual criterium *clone() const override { return new (std::nothrow) crit_invert(*this); };
574 };
575
577
578} // end of namespace
579
580#endif
exception used when memory has been exhausted
Definition: erreurs.hpp:127
the base class for all entry that have a name
Definition: cat_nomme.hpp:45
realises the AND operator
Definition: criterium.hpp:521
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:537
void gobe(crit_and &to_be_voided)
this call merges to the current call the arguments of another "crit_and", the given argument is clear...
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
returns true if the space used by EA of the first entry is greater or equal to the space used by the ...
Definition: criterium.hpp:442
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:452
returns true if the EA of the first entry is more recent or equal to the fixed date given in argument...
Definition: criterium.hpp:399
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:409
returns true if the EA of the first entry is more recent or equal to the one of the second entry
Definition: criterium.hpp:375
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:386
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:363
returns true if the in place entry has its EA saved (not just marked as saved) in the archve of refer...
Definition: criterium.hpp:461
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:471
returns true if the data of the first entry is bigger or equal to the one of the second entry
Definition: criterium.hpp:224
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:234
return true if the entry is a dirty file (or hard linked dirty file)
Definition: criterium.hpp:262
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:272
If the in_place entry is not an inode its date is considered equal to zero. Comparison is done on mti...
Definition: criterium.hpp:201
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:211
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
returns true if the data of the first entry is more recent or of the same date of the one of the seco...
Definition: criterium.hpp:177
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:187
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
if the entry is not an inode the result is also true
Definition: criterium.hpp:245
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:255
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
return true if the entry is a sparse file (or hard linked sparse file)
Definition: criterium.hpp:278
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:288
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
return true if the entry has delta signature
Definition: criterium.hpp:295
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:305
returns true if the first entry is a cat_directory (whatever is the second)
Definition: criterium.hpp:104
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:114
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
returns true if the first entry is a plain file (whatever is the second)
Definition: criterium.hpp:121
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:131
returns true if the first entry is a inode with several hard links (whatever is the second entry)
Definition: criterium.hpp:139
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:149
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
returns true if the first entry is an inode (whatever is the second)
Definition: criterium.hpp:87
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:97
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:168
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
returns true if the first entry has more or even EA (in number not in size) than the second entry
Definition: criterium.hpp:422
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:432
realises the negation of the criterium given in argument to its constructor
Definition: criterium.hpp:498
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:508
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
Definition: criterium.hpp:507
returns true if both inputs are inode of the same type (file/pipe/device/...) and share inode informa...
Definition: criterium.hpp:335
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:345
returns true if the two entries are of the same type (plain-file/char dev/block dev/named pipe/symlin...
Definition: criterium.hpp:481
virtual criterium * clone() const override
clone construction method
Definition: criterium.hpp:491
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const override
criterum interface method
the generic criterium class, parent of all criterium
Definition: criterium.hpp:52
virtual criterium * clone() const =0
clone construction method
virtual bool evaluate(const cat_nomme &first, const cat_nomme &second) const =0
criterum interface method
the arbitrary large positive integer class
contains all the excetion class thrown by libdar
switch module to limitint (32 ou 64 bits integers) or infinint
libdar namespace encapsulate all libdar symbols
Definition: archive.hpp:47