aboutsummaryrefslogtreecommitdiffstats
path: root/searchlib/src/vespa/searchlib/util/dirtraverse.h
blob: f2bf9cd6ffc93dd470bd1c5d2042f0425b5a5a92 (plain) (blame)
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
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.

#pragma once

#include <cstdint>

namespace search {

class DirectoryTraverse
{
private:
    DirectoryTraverse(const DirectoryTraverse &);
    DirectoryTraverse& operator=(const DirectoryTraverse &);

public:
    class Name
    {
    private:
        Name(const Name &);
        Name& operator=(const Name &);

    public:
        char *_name;
        Name *_next;
        explicit Name(const char *name);
        ~Name();
        static Name *sort(Name *head, int count);
    };
private:
    char *_baseDir;
    Name *_nameHead;
    int _nameCount;
    Name *_dirHead;
    Name *_dirTail;
    Name *_pdirHead;
    Name *_rdirHead;
    Name *_curDir;
    Name *_curName;
    char *_fullDirName;
    char *_fullName;
    char *_relName;
public:
    const char *GetFullName() const { return _fullName; }
    const char *GetRelName() const { return _relName; }
    void QueueDir(const char *name);
    void PushDir(const char *name);
    void PushRemoveDir(const char *name);
    void PushPushedDirs();
    Name *UnQueueDir();
    Name *UnQueueName();
    void ScanSingleDir();
    bool NextName();
    bool NextRemoveDir();
    bool RemoveTree();
    uint64_t GetTreeSize(); // Returns size of directory in bytes
    explicit DirectoryTraverse(const char *baseDir);
    ~DirectoryTraverse();
};

} // namespace search