Coverage Report

Created: 2024-09-11 06:42

/src/brpc/src/bvar/passive_status.h
Line
Count
Source (jump to first uncovered line)
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
// Date 2014/09/22 11:57:43
19
20
#ifndef  BVAR_PASSIVE_STATUS_H
21
#define  BVAR_PASSIVE_STATUS_H
22
23
#include "bvar/variable.h"
24
#include "bvar/reducer.h"
25
26
namespace bvar {
27
28
// Display a updated-by-need value. This is done by passing in an user callback
29
// which is called to produce the value.
30
// Example:
31
//   int print_number(void* arg) {
32
//      ...
33
//      return 5;
34
//   }
35
//
36
//   // number1 : 5
37
//   bvar::PassiveStatus<int> status1("number1", print_number, arg);
38
//
39
//   // foo_number2 : 5
40
//   bvar::PassiveStatus<int> status2("Foo", "number2", print_number, arg);
41
template <typename Tp>
42
class PassiveStatus : public Variable {
43
public:
44
    typedef Tp value_type;
45
    typedef detail::ReducerSampler<PassiveStatus, Tp, detail::AddTo<Tp>,
46
                                   detail::MinusFrom<Tp> > sampler_type;
47
    struct PlaceHolderOp {
48
0
        void operator()(Tp&, const Tp&) const {}
49
    };
50
    static const bool ADDITIVE = (butil::is_integral<Tp>::value ||
51
                                  butil::is_floating_point<Tp>::value ||
52
                                  is_vector<Tp>::value);
53
    class SeriesSampler : public detail::Sampler {
54
    public:
55
        typedef typename butil::conditional<
56
        ADDITIVE, detail::AddTo<Tp>, PlaceHolderOp>::type Op;
57
        explicit SeriesSampler(PassiveStatus* owner)
58
92
            : _owner(owner), _vector_names(NULL), _series(Op()) {}
bvar::PassiveStatus<double>::SeriesSampler::SeriesSampler(bvar::PassiveStatus<double>*)
Line
Count
Source
58
12
            : _owner(owner), _vector_names(NULL), _series(Op()) {}
bvar::PassiveStatus<long>::SeriesSampler::SeriesSampler(bvar::PassiveStatus<long>*)
Line
Count
Source
58
20
            : _owner(owner), _vector_names(NULL), _series(Op()) {}
bvar::PassiveStatus<unsigned long>::SeriesSampler::SeriesSampler(bvar::PassiveStatus<unsigned long>*)
Line
Count
Source
58
40
            : _owner(owner), _vector_names(NULL), _series(Op()) {}
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::SeriesSampler::SeriesSampler(bvar::PassiveStatus<bvar::Vector<long, 4ul> >*)
bvar::PassiveStatus<int>::SeriesSampler::SeriesSampler(bvar::PassiveStatus<int>*)
Line
Count
Source
58
20
            : _owner(owner), _vector_names(NULL), _series(Op()) {}
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::SeriesSampler::SeriesSampler(bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >*)
59
0
        ~SeriesSampler() {
60
0
            delete _vector_names;
61
0
        }
Unexecuted instantiation: bvar::PassiveStatus<double>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::PassiveStatus<long>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::PassiveStatus<int>::SeriesSampler::~SeriesSampler()
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::SeriesSampler::~SeriesSampler()
62
128
        void take_sample() override { _series.append(_owner->get_value()); }
bvar::PassiveStatus<long>::SeriesSampler::take_sample()
Line
Count
Source
62
29
        void take_sample() override { _series.append(_owner->get_value()); }
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::SeriesSampler::take_sample()
bvar::PassiveStatus<double>::SeriesSampler::take_sample()
Line
Count
Source
62
12
        void take_sample() override { _series.append(_owner->get_value()); }
bvar::PassiveStatus<unsigned long>::SeriesSampler::take_sample()
Line
Count
Source
62
58
        void take_sample() override { _series.append(_owner->get_value()); }
bvar::PassiveStatus<int>::SeriesSampler::take_sample()
Line
Count
Source
62
29
        void take_sample() override { _series.append(_owner->get_value()); }
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::SeriesSampler::take_sample()
Unexecuted instantiation: bvar::PassiveStatus<timeval>::SeriesSampler::take_sample()
63
0
        void describe(std::ostream& os) { _series.describe(os, _vector_names); }
Unexecuted instantiation: bvar::PassiveStatus<long>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::PassiveStatus<double>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::PassiveStatus<int>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::PassiveStatus<timeval>::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::SeriesSampler::describe(std::basic_ostream<char, std::char_traits<char> >&)
64
0
        void set_vector_names(const std::string& names) {
65
0
            if (_vector_names == NULL) {
66
0
                _vector_names = new std::string;
67
0
            }
68
0
            *_vector_names = names;
69
0
        }
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::SeriesSampler::set_vector_names(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::SeriesSampler::set_vector_names(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
70
    private:
71
        PassiveStatus* _owner;
72
        std::string* _vector_names;
73
        detail::Series<Tp, Op> _series;
74
    };
75
76
public:
77
    // NOTE: You must be very careful about lifetime of `arg' which should be
78
    // valid during lifetime of PassiveStatus.
79
    PassiveStatus(const butil::StringPiece& name,
80
                  Tp (*getfn)(void*), void* arg)
81
        : _getfn(getfn)
82
        , _arg(arg)
83
        , _sampler(NULL)
84
92
        , _series_sampler(NULL) {
85
92
        expose(name);
86
92
    }
bvar::PassiveStatus<long>::PassiveStatus(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, long (*)(void*), void*)
Line
Count
Source
84
20
        , _series_sampler(NULL) {
85
20
        expose(name);
86
20
    }
bvar::PassiveStatus<double>::PassiveStatus(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, double (*)(void*), void*)
Line
Count
Source
84
12
        , _series_sampler(NULL) {
85
12
        expose(name);
86
12
    }
bvar::PassiveStatus<int>::PassiveStatus(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, int (*)(void*), void*)
Line
Count
Source
84
20
        , _series_sampler(NULL) {
85
20
        expose(name);
86
20
    }
bvar::PassiveStatus<unsigned long>::PassiveStatus(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, unsigned long (*)(void*), void*)
Line
Count
Source
84
40
        , _series_sampler(NULL) {
85
40
        expose(name);
86
40
    }
87
    
88
    PassiveStatus(const butil::StringPiece& prefix,
89
                  const butil::StringPiece& name,
90
                  Tp (*getfn)(void*), void* arg)
91
        : _getfn(getfn)
92
        , _arg(arg)
93
        , _sampler(NULL)
94
0
        , _series_sampler(NULL) {
95
0
        expose_as(prefix, name);
96
0
    }
Unexecuted instantiation: bvar::PassiveStatus<timeval>::PassiveStatus(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, timeval (*)(void*), void*)
Unexecuted instantiation: bvar::PassiveStatus<int>::PassiveStatus(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, int (*)(void*), void*)
97
    
98
    PassiveStatus(Tp (*getfn)(void*), void* arg) 
99
        : _getfn(getfn)
100
        , _arg(arg)
101
        , _sampler(NULL)
102
0
        , _series_sampler(NULL) {
103
0
    }
Unexecuted instantiation: bvar::PassiveStatus<double>::PassiveStatus(double (*)(void*), void*)
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::PassiveStatus(unsigned long (*)(void*), void*)
Unexecuted instantiation: bvar::PassiveStatus<long>::PassiveStatus(long (*)(void*), void*)
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::PassiveStatus(bvar::Vector<long, 4ul> (*)(void*), void*)
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::PassiveStatus(bvar::Vector<unsigned int, 2ul> (*)(void*), void*)
Unexecuted instantiation: bvar::PassiveStatus<int>::PassiveStatus(int (*)(void*), void*)
104
105
0
    ~PassiveStatus() {
106
0
        hide();
107
0
        if (_sampler) {
108
0
            _sampler->destroy();
109
0
            _sampler = NULL;
110
0
        }
111
0
        if (_series_sampler) {
112
0
            _series_sampler->destroy();
113
0
            _series_sampler = NULL;
114
0
        }
115
0
    }
Unexecuted instantiation: bvar::PassiveStatus<double>::~PassiveStatus()
Unexecuted instantiation: bvar::PassiveStatus<long>::~PassiveStatus()
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::~PassiveStatus()
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::~PassiveStatus()
Unexecuted instantiation: bvar::PassiveStatus<int>::~PassiveStatus()
Unexecuted instantiation: bvar::PassiveStatus<timeval>::~PassiveStatus()
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::~PassiveStatus()
116
    
117
0
    int set_vector_names(const std::string& names) {
118
0
        if (_series_sampler) {
119
0
            _series_sampler->set_vector_names(names);
120
0
            return 0;
121
0
        }
122
0
        return -1;
123
0
    }
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::set_vector_names(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::set_vector_names(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
124
125
0
    void describe(std::ostream& os, bool /*quote_string*/) const override {
126
0
        os << get_value();
127
0
    }
Unexecuted instantiation: bvar::PassiveStatus<long>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::PassiveStatus<double>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::PassiveStatus<int>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::PassiveStatus<timeval>::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::describe(std::basic_ostream<char, std::char_traits<char> >&, bool) const
128
129
#ifdef BAIDU_INTERNAL
130
    void get_value(boost::any* value) const override {
131
        if (_getfn) {
132
            *value = _getfn(_arg);
133
        } else {
134
            *value = Tp();
135
        }
136
    }
137
#endif
138
    
139
128
    Tp get_value() const {
140
128
        return (_getfn ? _getfn(_arg) : Tp());
141
128
    }
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::get_value() const
bvar::PassiveStatus<long>::get_value() const
Line
Count
Source
139
29
    Tp get_value() const {
140
29
        return (_getfn ? _getfn(_arg) : Tp());
141
29
    }
bvar::PassiveStatus<double>::get_value() const
Line
Count
Source
139
12
    Tp get_value() const {
140
12
        return (_getfn ? _getfn(_arg) : Tp());
141
12
    }
bvar::PassiveStatus<unsigned long>::get_value() const
Line
Count
Source
139
58
    Tp get_value() const {
140
58
        return (_getfn ? _getfn(_arg) : Tp());
141
58
    }
bvar::PassiveStatus<int>::get_value() const
Line
Count
Source
139
29
    Tp get_value() const {
140
29
        return (_getfn ? _getfn(_arg) : Tp());
141
29
    }
Unexecuted instantiation: bvar::PassiveStatus<timeval>::get_value() const
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::get_value() const
142
    
143
0
    sampler_type* get_sampler() {
144
0
        if (NULL == _sampler) {
145
0
            _sampler = new sampler_type(this);
146
0
            _sampler->schedule();
147
0
        }
148
0
        return _sampler;
149
0
    }
Unexecuted instantiation: bvar::PassiveStatus<double>::get_sampler()
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::get_sampler()
Unexecuted instantiation: bvar::PassiveStatus<long>::get_sampler()
150
151
0
    detail::AddTo<Tp> op() const { return detail::AddTo<Tp>(); }
Unexecuted instantiation: bvar::PassiveStatus<double>::op() const
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::op() const
Unexecuted instantiation: bvar::PassiveStatus<long>::op() const
152
0
    detail::MinusFrom<Tp> inv_op() const { return detail::MinusFrom<Tp>(); }
Unexecuted instantiation: bvar::PassiveStatus<double>::inv_op() const
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::inv_op() const
Unexecuted instantiation: bvar::PassiveStatus<long>::inv_op() const
153
154
0
    int describe_series(std::ostream& os, const SeriesOptions& options) const override {
155
0
        if (_series_sampler == NULL) {
156
0
            return 1;
157
0
        }
158
0
        if (!options.test_only) {
159
0
            _series_sampler->describe(os);
160
0
        }
161
0
        return 0;
162
0
    }
Unexecuted instantiation: bvar::PassiveStatus<long>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::PassiveStatus<double>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::PassiveStatus<int>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::PassiveStatus<timeval>::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::describe_series(std::basic_ostream<char, std::char_traits<char> >&, bvar::SeriesOptions const&) const
163
164
0
    Tp reset() {
165
0
        CHECK(false) << "PassiveStatus::reset() should never be called, abort";
166
0
        abort();
167
0
    }
Unexecuted instantiation: bvar::PassiveStatus<double>::reset()
Unexecuted instantiation: bvar::PassiveStatus<unsigned long>::reset()
Unexecuted instantiation: bvar::PassiveStatus<long>::reset()
168
169
protected:
170
    int expose_impl(const butil::StringPiece& prefix,
171
                    const butil::StringPiece& name,
172
92
                    DisplayFilter display_filter) override {
173
92
        const int rc = Variable::expose_impl(prefix, name, display_filter);
174
92
        if (ADDITIVE &&
175
92
            rc == 0 &&
176
92
            _series_sampler == NULL &&
177
92
            FLAGS_save_series) {
178
92
            _series_sampler = new SeriesSampler(this);
179
92
            _series_sampler->schedule();
180
92
        }
181
92
        return rc;
182
92
    }
bvar::PassiveStatus<long>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
172
20
                    DisplayFilter display_filter) override {
173
20
        const int rc = Variable::expose_impl(prefix, name, display_filter);
174
20
        if (ADDITIVE &&
175
20
            rc == 0 &&
176
20
            _series_sampler == NULL &&
177
20
            FLAGS_save_series) {
178
20
            _series_sampler = new SeriesSampler(this);
179
20
            _series_sampler->schedule();
180
20
        }
181
20
        return rc;
182
20
    }
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<long, 4ul> >::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
bvar::PassiveStatus<double>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
172
12
                    DisplayFilter display_filter) override {
173
12
        const int rc = Variable::expose_impl(prefix, name, display_filter);
174
12
        if (ADDITIVE &&
175
12
            rc == 0 &&
176
12
            _series_sampler == NULL &&
177
12
            FLAGS_save_series) {
178
12
            _series_sampler = new SeriesSampler(this);
179
12
            _series_sampler->schedule();
180
12
        }
181
12
        return rc;
182
12
    }
bvar::PassiveStatus<unsigned long>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
172
40
                    DisplayFilter display_filter) override {
173
40
        const int rc = Variable::expose_impl(prefix, name, display_filter);
174
40
        if (ADDITIVE &&
175
40
            rc == 0 &&
176
40
            _series_sampler == NULL &&
177
40
            FLAGS_save_series) {
178
40
            _series_sampler = new SeriesSampler(this);
179
40
            _series_sampler->schedule();
180
40
        }
181
40
        return rc;
182
40
    }
bvar::PassiveStatus<int>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Line
Count
Source
172
20
                    DisplayFilter display_filter) override {
173
20
        const int rc = Variable::expose_impl(prefix, name, display_filter);
174
20
        if (ADDITIVE &&
175
20
            rc == 0 &&
176
20
            _series_sampler == NULL &&
177
20
            FLAGS_save_series) {
178
20
            _series_sampler = new SeriesSampler(this);
179
20
            _series_sampler->schedule();
180
20
        }
181
20
        return rc;
182
20
    }
Unexecuted instantiation: bvar::PassiveStatus<timeval>::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
Unexecuted instantiation: bvar::PassiveStatus<bvar::Vector<unsigned int, 2ul> >::expose_impl(butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, butil::BasicStringPiece<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, bvar::DisplayFilter)
183
184
private:
185
    Tp (*_getfn)(void*);
186
    void* _arg;
187
    sampler_type* _sampler;
188
    SeriesSampler* _series_sampler;
189
};
190
191
// ccover g++ may complain about ADDITIVE is undefined unless it's 
192
// explicitly declared here.
193
template <typename Tp> const bool PassiveStatus<Tp>::ADDITIVE;
194
195
// Specialize std::string for using std::ostream& as a more friendly
196
// interface for user's callback.
197
template <>
198
class PassiveStatus<std::string> : public Variable {
199
public:
200
    // NOTE: You must be very careful about lifetime of `arg' which should be
201
    // valid during lifetime of PassiveStatus.
202
    PassiveStatus(const butil::StringPiece& name,
203
                  void (*print)(std::ostream&, void*), void* arg)
204
72
        : _print(print), _arg(arg) {
205
72
        expose(name);
206
72
    }
207
208
    PassiveStatus(const butil::StringPiece& prefix,
209
                  const butil::StringPiece& name,
210
                  void (*print)(std::ostream&, void*), void* arg)
211
0
        : _print(print), _arg(arg) {
212
0
        expose_as(prefix, name);
213
0
    }
214
215
    PassiveStatus(void (*print)(std::ostream&, void*), void* arg) 
216
0
        : _print(print), _arg(arg) {}
217
218
0
    ~PassiveStatus() {
219
0
        hide();
220
0
    }
221
222
0
    void describe(std::ostream& os, bool quote_string) const override {
223
0
        if (quote_string) {
224
0
            if (_print) {
225
0
                os << '"';
226
0
                _print(os, _arg);
227
0
                os << '"';
228
0
            } else {
229
0
                os << "\"null\"";
230
0
            }
231
0
        } else {
232
0
            if (_print) {
233
0
                _print(os, _arg);
234
0
            } else {
235
0
                os << "null";
236
0
            }
237
0
        }
238
0
    }
239
240
private:
241
    void (*_print)(std::ostream&, void*);
242
    void* _arg;
243
};
244
245
template <typename Tp>
246
class BasicPassiveStatus : public PassiveStatus<Tp> {
247
public:
248
    BasicPassiveStatus(const butil::StringPiece& name,
249
                       Tp (*getfn)(void*), void* arg)
250
        : PassiveStatus<Tp>(name, getfn, arg) {}
251
    
252
    BasicPassiveStatus(const butil::StringPiece& prefix,
253
                       const butil::StringPiece& name,
254
                       Tp (*getfn)(void*), void* arg)
255
        : PassiveStatus<Tp>(prefix, name, getfn, arg) {}
256
257
    BasicPassiveStatus(Tp (*getfn)(void*), void* arg)
258
        : PassiveStatus<Tp>(getfn, arg) {}
259
};
260
261
template <>
262
class BasicPassiveStatus<std::string> : public PassiveStatus<std::string> {
263
public:
264
    BasicPassiveStatus(const butil::StringPiece& name,
265
                       void (*print)(std::ostream&, void*), void* arg)
266
0
        : PassiveStatus<std::string>(name, print, arg) {}
267
    
268
    BasicPassiveStatus(const butil::StringPiece& prefix,
269
                       const butil::StringPiece& name,
270
                       void (*print)(std::ostream&, void*), void* arg)
271
0
        : PassiveStatus<std::string>(prefix, name, print, arg) {}
272
273
    BasicPassiveStatus(void (*print)(std::ostream&, void*), void* arg)
274
0
        : PassiveStatus<std::string>(print, arg) {}
275
};
276
277
278
}  // namespace bvar
279
280
#endif  //BVAR_PASSIVE_STATUS_H