-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathdirentry.cpp
More file actions
78 lines (68 loc) · 1.88 KB
/
direntry.cpp
File metadata and controls
78 lines (68 loc) · 1.88 KB
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include "direntry.hpp"
#include <algorithm>
#include <sstream>
#include <vector>
using std::find_if;
using std::istringstream;
using std::make_shared;
using std::shared_ptr;
using std::string;
using std::vector;
using std::weak_ptr;
DirEntry::DirEntry() {
is_locked = false;
}
shared_ptr<DirEntry> DirEntry::make_de_dir(const string name,
const shared_ptr<DirEntry> parent) {
auto sp = make_shared<DirEntry>(DirEntry());
if (parent == nullptr) {
sp->parent = sp;
} else {
sp->parent = parent;
}
sp->type = dir;
sp->self = sp;
sp->name = name;
sp->inode = nullptr;
return sp;
}
shared_ptr<DirEntry> DirEntry::make_de_file(const string name,
const shared_ptr<DirEntry> parent,
const shared_ptr<Inode> &inode) {
auto sp = make_shared<DirEntry>(DirEntry());
if (parent == nullptr) {
sp->parent = sp;
} else {
sp->parent = parent;
}
sp->type = file;
sp->self = sp;
sp->name = name;
sp->inode = inode;
return sp;
}
shared_ptr<DirEntry> DirEntry::find_child(const string name) const {
// handle . and ..
if (name == "..") {
return parent.lock();
} else if (name == ".") {
return self.lock();
}
// search through contents and return ptr if found, otherwise nullptr
auto named = [&] (const shared_ptr<DirEntry> de) {return de->name == name;};
auto it = find_if(begin(contents), end(contents), named);
if (it == end(contents)) {
return nullptr;
}
return *it;
}
shared_ptr<DirEntry> DirEntry::add_dir(const string name) {
auto new_dir = make_de_dir(name, self.lock());
contents.push_back(new_dir);
return new_dir;
}
shared_ptr<DirEntry> DirEntry::add_file(const string name) {
auto new_file = make_de_file(name, self.lock(), make_shared<Inode>());
contents.push_back(new_file);
return new_file;
}