| 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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
 | #include "opt.h"
#include "ygetopt.h"
#include <util/generic/string.h>
#include <util/generic/vector.h>
#include <util/generic/yexception.h>
class TGetOpt::TImpl: public TSimpleRefCount<TImpl> {
public:
    inline TImpl(int argc, const char* const* argv, const TString& fmt)
        : args(argv, argv + argc)
        , format(fmt)
    {
        if (argc == 0) {
            ythrow yexception() << "zero argc";
        }
    }
    inline ~TImpl() = default;
    TVector<TString> args;
    const TString format;
};
class TGetOpt::TIterator::TIterImpl: public TSimpleRefCount<TIterImpl> {
public:
    inline TIterImpl(const TGetOpt* parent)
        : Args_(parent->Impl_->args)
        , ArgsPtrs_(new char*[Args_.size() + 1])
        , Format_(parent->Impl_->format)
        , OptLet_(0)
        , Arg_(nullptr)
    {
        for (size_t i = 0; i < Args_.size(); ++i) {
            ArgsPtrs_.Get()[i] = Args_[i].begin();
        }
        ArgsPtrs_.Get()[Args_.size()] = nullptr;
        Opt_.Reset(new Opt((int)Args_.size(), ArgsPtrs_.Get(), Format_.data()));
    }
    inline ~TIterImpl() = default;
    inline void Next() {
        OptLet_ = Opt_->Get();
        Arg_ = Opt_->Arg;
    }
    inline char Key() const noexcept {
        return (char)OptLet_;
    }
    inline const char* Arg() const noexcept {
        return Arg_;
    }
    inline bool AtEnd() const noexcept {
        return OptLet_ == EOF;
    }
private:
    TVector<TString> Args_;
    TArrayHolder<char*> ArgsPtrs_;
    const TString Format_;
    THolder<Opt> Opt_;
    int OptLet_;
    const char* Arg_;
};
TGetOpt::TIterator::TIterator() noexcept
    : Impl_(nullptr)
{
}
TGetOpt::TIterator::TIterator(const TGetOpt* parent)
    : Impl_(new TIterImpl(parent))
{
    Next();
}
void TGetOpt::TIterator::Next() {
    Impl_->Next();
}
char TGetOpt::TIterator::Key() const noexcept {
    return Impl_->Key();
}
bool TGetOpt::TIterator::AtEnd() const noexcept {
    if (Impl_.Get()) {
        return Impl_->AtEnd();
    }
    return true;
}
const char* TGetOpt::TIterator::Arg() const noexcept {
    if (Impl_.Get()) {
        return Impl_->Arg();
    }
    return nullptr;
}
TGetOpt::TGetOpt(int argc, const char* const* argv, const TString& format)
    : Impl_(new TImpl(argc, argv, format))
{
}
 |