@@ -331,11 +331,13 @@ size_t mbvar_list_exposed(std::vector<std::string>* names) {
331331
332332多维度统计的实现,主要提供bvar的获取、列举等功能。
333333
334+ 为了兼容旧的用法,KeyType默认类型是std::list< std::string > 。KeyType必须是(STL或者自定义)容器,value_type必须是std::string。
335+
334336## constructor
335337
336338有三个构造函数:
337339``` c++
338- template <typename T>
340+ template <typename T, typename KeyType = std::list<std::string> >
339341class MultiDimension : public MVariable {
340342public:
341343 // 不建议使用
@@ -398,7 +400,7 @@ bvar::MultiDimension<bvar::Adder<int> > g_request_count("foo_bar", "request_coun
398400
399401## stats
400402```c++
401- template <typename T>
403+ template <typename T, typename KeyType = std::list<std::string> >
402404class MultiDimension : public MVariable {
403405public:
404406 ...
@@ -410,7 +412,15 @@ public:
410412```
411413
412414### get_stats
413- 根据指定label获取对应的单维度统计项bvar
415+ 根据指定label获取对应的单维度统计项bvar。
416+
417+ get_stats除了支持(默认)std::list< std::string > 参数类型,也支持自定义参数类型,满足以下条件:
418+ 1 . (STL或者自定义)容器。
419+ 2 . K::value_type支持通过operator std::string()转换为std::string和通过operator butil::StringPiece()转换为butil::StringPiece。
420+ 3 . K::value_type支持和std::string进行比较。
421+
422+ 推荐使用不需要分配内存的容器(例如,std::array、absl::InlinedVector)和不需要拷贝字符串的数据结构(例如,const char* 、std::string_view、butil::StringPieces),可以提高性能。
423+
414424``` c++
415425#include < bvar/bvar.h>
416426#include < bvar/multi_dimension.h>
@@ -420,7 +430,8 @@ namespace bar {
420430// 定义一个全局的多维度mbvar变量
421431bvar::MultiDimension< bvar::Adder<int > > g_request_count("request_count", {"idc", "method", "status"});
422432
423- int get_request_count(const std::list< std::string > & request_label) {
433+ template <typename K >
434+ int get_request_count(const K& request_label) {
424435 // 获取request_label对应的单维度bvar指针,比如:request_label = {"tc", "get", "200"}
425436 bvar::Adder<int > * request_adder = g_request_count.get_stats(request_label);
426437 // 判断指针非空
@@ -433,6 +444,70 @@ int get_request_count(const std::list<std::string>& request_label) {
433444 return request_adder->get_value();
434445}
435446
447+ std::list< std::string > request_label_list = {"tc", "get", "200"};
448+ int request_count = get_request_count(request_label_list);
449+
450+ std::vector< std::string_view > request_label_list = {"tc", "get", "200"};
451+ int request_count = get_request_count(request_label_list);
452+
453+ std::vector< butil::StringPiece > request_label_list = {"tc", "get", "200"};
454+ int request_count = get_request_count(request_label_list);
455+
456+ class MyStringView {
457+ public:
458+ MyStringView() : _ ptr(NULL), _ len(0) {}
459+ MyStringView(const char* str)
460+ : _ ptr(str),
461+ _ len(str == NULL ? 0 : strlen(str)) {}
462+ #if __ cplusplus >= 201703L
463+ MyStringView(const std::string_view& str)
464+ : _ ptr(str.data()), _ len(str.size()) {}
465+ #endif // __ cplusplus >= 201703L
466+ MyStringView(const std::string& str)
467+ : _ ptr(str.data()), _ len(str.size()) {}
468+ MyStringView(const char* offset, size_t len)
469+ : _ ptr(offset), _ len(len) {}
470+
471+ const char* data() const { return _ptr; }
472+ size_t size () const { return _ len; }
473+
474+ // Converts to `std::basic_string`.
475+ explicit operator std::string() const {
476+ if (NULL == _ptr) {
477+ return {};
478+ }
479+ return {_ptr, size()};
480+ }
481+
482+ // Converts to butil::StringPiece.
483+ explicit operator butil::StringPiece() const {
484+ if (NULL == _ptr) {
485+ return {};
486+ }
487+ return {_ptr, size()};
488+ }
489+
490+ private:
491+ const char* _ ptr;
492+ size_t _ len;
493+ };
494+
495+ bool operator ==(const MyStringView& x, const std::string& y) {
496+ if (x.size() != y.size()) {
497+ return false;
498+ }
499+ return butil::StringPiece::wordmemcmp(x.data(), y.data(), x.size()) == 0;
500+ }
501+ bool operator ==(const std::string& x, const MyStringView& y) {
502+ if (x.size() != y.size()) {
503+ return false;
504+ }
505+ return butil::StringPiece::wordmemcmp(x.data(), y.data(), x.size()) == 0;
506+ }
507+
508+ std::vector<MyStringView> request_label_list = {"tc", "get", "200"};
509+ int request_count = get_request_count(request_label_list);
510+
436511} // namespace bar
437512} // namespace foo
438513```
@@ -462,7 +537,7 @@ public:
462537 size_t count_labels() const;
463538};
464539
465- template <typename T>
540+ template <typename T, typename KeyType = std::list < std::string > >
466541class MultiDimension : public MVariable {
467542public:
468543 ...
@@ -536,7 +611,7 @@ size_t count_stats() {
536611
537612## list
538613``` c++
539- template <typename T>
614+ template <typename T, typename KeyType = std::list<std::string> >
540615class MultiDimension : public MVariable {
541616public:
542617 ...
0 commit comments