-
Notifications
You must be signed in to change notification settings - Fork 0
/
extractorfromcontainer.h
61 lines (49 loc) · 2.56 KB
/
extractorfromcontainer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#ifndef EXTRACTORFROMCONTAINER_H
#define EXTRACTORFROMCONTAINER_H
/*
Copyright (c) 2024 Sidorov Dmitry
Permission is hereby granted, free of charge, to any person obtaining a copy of this software
and associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "extractornew.h"
namespace dbframework {
/*!
The ExtractorFromContainer class template is the special implementation of extractor.In this framework extractor is a class that is used to get
pointer to some object (called stored object) stored inside other object (called storage object). The ExtractorFromContainer is used when storage
object is some STL-compatible container and stored object is the container element. ExtractorFromContainer::extract adds new element to the
container and returns pointer to it. ExtractorFromContainer::rollback erases last element from the container.
Template parameters.
Storage is the storage class. Storage should be some STL-compatible container having methods emplace_back, back, empty and erase. Storage::value_type
shoud define the type of container elements.
*/
template <class Storage>
class ExtractorFromContainer : public ExtractorNew<Storage, typename Storage::value_type> {
protected:
void* doExtract(void* src) override {
this->setNewElement(false);
Storage* p = static_cast<Storage*>(src);
p->emplace_back();
this->setNewElement(true);
return &p->back();
}
void doRollback(void* src) override
{
Storage* p = static_cast<Storage*>(src);
if (!p->empty() && this->newElement()) {
this->setNewElement(false);
p->erase(--p->end());
}
}
};
}
#endif //EXTRACTORFROMCONTAINER_H