muduo : StringPiece
来源:互联网 发布:php高级工程师证书 编辑:程序博客网 时间:2024/05/20 05:47
http://www.zhihu.com/question/34499426/answer/58891014
为什么要有这个类?
C++里面有string和char*,如果你用const string &s 做函数形参,可以同时兼容两种字符串。但当你传入一个很长的char * 时,会生成一个较大的string对象,开销比较大。
如果你的目的仅仅是读取字符串的值,用这个StringPiece的话,仅仅是4+一个指针的内存开销,而且也保证了兼容性。
所以这个类的目的是传入字符串的字面值,它内部的ptr_ 这块内存不归他所有。所以不能做任何改动。
#ifndef MUDUO_BASE_STRINGPIECE_H#define MUDUO_BASE_STRINGPIECE_H#include <string.h>#include <iosfwd> // for ostream forward-declaration#include <muduo/base/Types.h>#ifndef MUDUO_STD_STRING#include <string>#endifnamespace muduo {// For passing C-style string argument to a function.class StringArg // copyable{ public: StringArg(const char* str) : str_(str) { } StringArg(const string& str) : str_(str.c_str()) { }#ifndef MUDUO_STD_STRING StringArg(const std::string& str) : str_(str.c_str()) { }#endif const char* c_str() const { return str_; } private: const char* str_;};class StringPiece { private: const char* ptr_; int length_; public: // We provide non-explicit singleton constructors so users can pass // in a "const char*" or a "string" wherever a "StringPiece" is // expected. StringPiece() : ptr_(NULL), length_(0) { } StringPiece(const char* str) : ptr_(str), length_(static_cast<int>(strlen(ptr_))) { } StringPiece(const unsigned char* str) : ptr_(reinterpret_cast<const char*>(str)), length_(static_cast<int>(strlen(ptr_))) { } StringPiece(const string& str) : ptr_(str.data()), length_(static_cast<int>(str.size())) { }#ifndef MUDUO_STD_STRING StringPiece(const std::string& str) : ptr_(str.data()), length_(static_cast<int>(str.size())) { }#endif StringPiece(const char* offset, int len) : ptr_(offset), length_(len) { } // data() may return a pointer to a buffer with embedded NULs, and the // returned buffer may or may not be null terminated. Therefore it is // typically a mistake to pass data() to a routine that expects a NUL // terminated string. Use "as_string().c_str()" if you really need to do // this. Or better yet, change your routine so it does not rely on NUL // termination. const char* data() const { return ptr_; } int size() const { return length_; } bool empty() const { return length_ == 0; } const char* begin() const { return ptr_; } const char* end() const { return ptr_ + length_; } void clear() { ptr_ = NULL; length_ = 0; } void set(const char* buffer, int len) { ptr_ = buffer; length_ = len; } void set(const char* str) { ptr_ = str; length_ = static_cast<int>(strlen(str)); } void set(const void* buffer, int len) { ptr_ = reinterpret_cast<const char*>(buffer); length_ = len; } char operator[](int i) const { return ptr_[i]; } void remove_prefix(int n) { ptr_ += n; length_ -= n; } void remove_suffix(int n) { length_ -= n; } bool operator==(const StringPiece& x) const { return ((length_ == x.length_) && (memcmp(ptr_, x.ptr_, length_) == 0)); } bool operator!=(const StringPiece& x) const { return !(*this == x); }#define STRINGPIECE_BINARY_PREDICATE(cmp,auxcmp) \ bool operator cmp (const StringPiece& x) const { \ int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); \ return ((r auxcmp 0) || ((r == 0) && (length_ cmp x.length_))); \ } STRINGPIECE_BINARY_PREDICATE(<, <); STRINGPIECE_BINARY_PREDICATE(<=, <); STRINGPIECE_BINARY_PREDICATE(>=, >); STRINGPIECE_BINARY_PREDICATE(>, >);#undef STRINGPIECE_BINARY_PREDICATE int compare(const StringPiece& x) const { int r = memcmp(ptr_, x.ptr_, length_ < x.length_ ? length_ : x.length_); if (r == 0) { if (length_ < x.length_) r = -1; else if (length_ > x.length_) r = +1; } return r; } string as_string() const { return string(data(), size()); } void CopyToString(string* target) const { target->assign(ptr_, length_); }#ifndef MUDUO_STD_STRING void CopyToStdString(std::string* target) const { target->assign(ptr_, length_); }#endif // Does "this" start with "x" bool starts_with(const StringPiece& x) const { return ((length_ >= x.length_) && (memcmp(ptr_, x.ptr_, x.length_) == 0)); }};} // namespace muduo// ------------------------------------------------------------------// Functions used to create STL containers that use StringPiece// Remember that a StringPiece's lifetime had better be less than// that of the underlying string or char*. If it is not, then you// cannot safely store a StringPiece into an STL container// ------------------------------------------------------------------#ifdef HAVE_TYPE_TRAITS// This makes vector<StringPiece> really fast for some STL implementationstemplate<> struct __type_traits<muduo::StringPiece> { typedef __true_type has_trivial_default_constructor; typedef __true_type has_trivial_copy_constructor; typedef __true_type has_trivial_assignment_operator; typedef __true_type has_trivial_destructor; typedef __true_type is_POD_type;};#endif// allow StringPiece to be loggedstd::ostream& operator<<(std::ostream& o, const muduo::StringPiece& piece);#endif // MUDUO_BASE_STRINGPIECE_H
注意体会这两个函数:
void remove_prefix(int n) { ptr_ += n; length_ -= n; } void remove_suffix(int n) { length_ -= n; }
0 0
- muduo : StringPiece
- muduo::StringPiece
- StringPiece
- [Muduo网络库源码分析] (8) base/StringPiece.h_字符串参数传递类型
- muduo Accept
- muduo启程
- muduo总结
- muduo总结
- 学习 muduo。
- muduo:互斥量
- muduo : Thread
- muduo : AtomicInteger
- muduo : MutexLock
- muduo : Condition
- muduo : ThreadPool
- muduo : Timer
- muduo : Acceptor
- muduo : TcpServer
- hdoj4548美素数
- std::max
- Android高效加载大图、多图解决方案,有效避免程序OOM
- Java泛型四:泛型实现原理之类型擦除
- 员工激励的核心是人的满足感
- muduo : StringPiece
- AngularJS
- 四大浏览器内核
- hdu 2896 病毒侵袭 ac自动机
- Leetcode题解 268. Missing Number
- linux 下查看 .so 导出函数列表
- PreferenceScreen修改背景颜色
- 按照指定长度切割字符串
- 剑指offer——数组中重复的数字