/src/brpc/src/bvar/mvariable.h
Line  | Count  | Source  | 
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: 2021/11/17 14:37:53  | 
19  |  |  | 
20  |  | #ifndef BVAR_MVARIABLE_H  | 
21  |  | #define BVAR_MVARIABLE_H  | 
22  |  |  | 
23  |  | #include <ostream>                      // std::ostream  | 
24  |  | #include <sstream>                      // std::ostringstream  | 
25  |  | #include <list>                         // std::list  | 
26  |  | #include <string>                       // std::string  | 
27  |  | #include "butil/macros.h"               // DISALLOW_COPY_AND_ASSIGN  | 
28  |  | #include "butil/strings/string_piece.h" // butil::StringPiece  | 
29  |  |  | 
30  |  | namespace bvar { | 
31  |  |  | 
32  |  | class Dumper;  | 
33  |  | struct DumpOptions;  | 
34  |  |  | 
35  |  | class MVariableBase { | 
36  |  | public:  | 
37  |  |     MVariableBase() = default;  | 
38  |  |  | 
39  |  |     virtual ~MVariableBase();  | 
40  |  |  | 
41  |  |     // Implement this method to print the mvariable info into ostream.  | 
42  |  |     virtual void describe(std::ostream&) = 0;  | 
43  |  |  | 
44  |  |     // string form of describe().  | 
45  |  |     std::string get_description();  | 
46  |  |      | 
47  |  |     // Get mvariable name  | 
48  | 0  |     const std::string& name() const { return _name; } | 
49  |  |  | 
50  |  |     // Expose this mvariable globally so that it's counted in following  | 
51  |  |     // functions:  | 
52  |  |     //      list_exposed  | 
53  |  |     //      count_exposed  | 
54  |  |     // Return 0 on success, -1 otherwise.  | 
55  | 0  |     int expose(const butil::StringPiece& name) { | 
56  | 0  |         return expose_impl(butil::StringPiece(), name);  | 
57  | 0  |     }  | 
58  |  |  | 
59  |  |     // Expose this mvariable globally with a prefix  | 
60  |  |     // Return 0 on success, -1 otherwise.  | 
61  |  |     int expose_as(const butil::StringPiece& prefix,  | 
62  | 0  |                   const butil::StringPiece& name) { | 
63  | 0  |         return expose_impl(prefix, name);  | 
64  | 0  |     }  | 
65  |  |  | 
66  |  |     // Dump this mvariable  | 
67  |  |     virtual size_t dump(Dumper* dumper, const DumpOptions* options) = 0;  | 
68  |  |  | 
69  |  |     // Hide this variable so that it's not counted in *_exposed functions.  | 
70  |  |     // Returns false if this variable is already hidden.  | 
71  |  |     // CAUTION!! Subclasses must call hide() manually to avoid displaying  | 
72  |  |     // a variable that is just destructing.  | 
73  |  |     bool hide();  | 
74  |  |  | 
75  |  |     // Get number of exposed mvariables.  | 
76  |  |     static size_t count_exposed();  | 
77  |  |  | 
78  |  |     // Put names of all exposed mvariable into `name'.  | 
79  |  |     static void list_exposed(std::vector<std::string> *names);  | 
80  |  |  | 
81  |  |     // Find all exposed mvariables matching `white_wildcards' but  | 
82  |  |     // `black_wildcards' and send them to `dumper'.  | 
83  |  |     // Use default options when `options' is NULL.  | 
84  |  |     // Return number of dumped mvariables, -1 on error.  | 
85  |  |     static size_t dump_exposed(Dumper* dumper, const DumpOptions* options);  | 
86  |  |  | 
87  |  |     // Find an exposed mvariable by `name' and put its description into `os'.  | 
88  |  |     // Returns 0 on found, -1 otherwise.  | 
89  |  |     static int describe_exposed(const std::string& name,  | 
90  |  |                                 std::ostream& os);  | 
91  |  |  | 
92  |  |     // String form. Returns empty string when not found.  | 
93  |  |     static std::string describe_exposed(const std::string& name);  | 
94  |  |  | 
95  |  | #ifdef UNIT_TEST  | 
96  |  |     // Hide all mvariables so that all mvariables not counted in following  | 
97  |  |     // functions:  | 
98  |  |     //      list_exposed  | 
99  |  |     //      count_exposed  | 
100  |  |     // CAUTION!!! Just For Debug!!!  | 
101  |  |     static void hide_all();  | 
102  |  | #endif  | 
103  |  |  | 
104  |  | protected:  | 
105  |  |     int expose_impl(const butil::StringPiece& prefix,  | 
106  |  |                     const butil::StringPiece& name);  | 
107  |  |  | 
108  |  | protected:  | 
109  |  |     std::string _name;  | 
110  |  |  | 
111  |  |     // mbvar uses bvar, bvar uses TLS, thus copying/assignment need to copy TLS stuff as well,  | 
112  |  |     // which is heavy. We disable copying/assignment now.   | 
113  |  |     DISALLOW_COPY_AND_ASSIGN(MVariableBase);  | 
114  |  | };  | 
115  |  |  | 
116  |  | template <typename KeyType>  | 
117  |  | class MVariable : public MVariableBase { | 
118  |  | public:  | 
119  |  |     explicit MVariable(const KeyType& labels) : _labels(labels.cbegin(), labels.cend()) { | 
120  |  |         static_assert(std::is_same<typename KeyType::value_type, std::string>::value,  | 
121  |  |                       "value_type of KeyType must be std::string");  | 
122  |  |     }  | 
123  |  |  | 
124  |  |     // Get mvariable labels  | 
125  |  |     const KeyType& labels() const { return _labels; } | 
126  |  |  | 
127  |  |     // Get number of mvariable labels  | 
128  |  |     size_t count_labels() const { return _labels.size(); } | 
129  |  |  | 
130  |  | protected:  | 
131  |  |     KeyType  _labels;  | 
132  |  | };  | 
133  |  |  | 
134  |  | } // namespace bvar  | 
135  |  |  | 
136  |  | #endif  // BVAR_MVARIABLE_H  |