[Muduo网络库源码分析] (8) base/StringPiece.h_字符串参数传递类型
来源:互联网 发布:mac 恢复icloud 删除 编辑:程序博客网 时间:2024/06/05 11:16
字符串参数传递类型
实现:StringPiece、StringArg类
功能:实现字符串类型、字符串参数传递类型
知识点:
- __type_traits
对一个类型进行描述,从而对其运算速度进行优化 - reinterpret_cast
其可以进行指针间的转换,并且其可以实现指针和整数的相互转换
用途:
可用于字符串传参,和其他字符串处理
代码及分析:
StringPiece.h
// Taken from PCRE pcre_stringpiece.h//// Copyright (c) 2005, Google Inc.// All rights reserved.//// Redistribution and use in source and binary forms, with or without// modification, are permitted provided that the following conditions are// met://// * Redistributions of source code must retain the above copyright// notice, this list of conditions and the following disclaimer.// * Redistributions in binary form must reproduce the above// copyright notice, this list of conditions and the following disclaimer// in the documentation and/or other materials provided with the// distribution.// * Neither the name of Google Inc. nor the names of its// contributors may be used to endorse or promote products derived from// this software without specific prior written permission.//// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.//// Author: Sanjay Ghemawat//// A string like object that points into another piece of memory.// Useful for providing an interface that allows clients to easily// pass in either a "const char*" or a "string".//// Arghh! I wish C++ literals were automatically of type "string".#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) { } //构造函数 string类型 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]; } //截掉前n个字符 void remove_prefix(int n) { ptr_ += n; length_ -= n; } //截掉后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 //比较两个对象是否相等,利用memcmp进行比较 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 类型返回 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 { //将string 内容清空,并将ptr_字符串赋值给string target->assign(ptr_, length_); }#endif //将StringPiece与当前字符串比较是否相同 // 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// 经过特化的StringPiece // 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; //是C++的内建类型或传统的C结构体类型};#endif// allow StringPiece to be logged// 重载运算符,以便写日志std::ostream& operator<<(std::ostream& o, const muduo::StringPiece& piece);#endif // MUDUO_BASE_STRINGPIECE_H
阅读全文
0 0
- [Muduo网络库源码分析] (8) base/StringPiece.h_字符串参数传递类型
- [Muduo网络库源码分析] (11) base/Types.h_基本类型声明
- [Muduo网络库源码分析] (1) base/Atomic.h_原子操作与原子整数
- [Muduo网络库源码分析] (6) base/Mutex.h_互斥锁操作
- [Muduo网络库源码分析] (10) base/ThreadPoll_cc_h_线程池
- [Muduo网络库源码分析] (2) base/Condition.cc_h_条件变量操作
- [Muduo网络库源码分析] (3) base/CountDownLatch.cc_h_“倒计时门闩”同步
- [Muduo网络库源码分析] (4) base/Exception_cc_h_带 stack trace 的异常基类
- [Muduo网络库源码分析] (5) base/FileUtil.cc_h_文件操作
- [Muduo网络库源码分析] (7) base/Singleton.h_SINGLETON对象创建型模式
- [Muduo网络库源码分析] (9) base/Thread.cc_h_CurrentThread_h线程对象
- muduo : StringPiece
- muduo::StringPiece
- muduo网络库源码分析-定时器
- muduo库源码分析
- muduo库源码学习(base)Atomic
- muduo库源码学习(base)AsyncLogging
- muduo库源码学习(base)Condition
- hdu 3364 Lanterns (高斯消元)
- 欢迎使用CSDN-markdown编辑器
- 【Docker学习】运行Docker时遇到的一些错误
- Zepto源码之Callbacks模块
- 读《程序员的数学》
- [Muduo网络库源码分析] (8) base/StringPiece.h_字符串参数传递类型
- js清空数组的三种方法
- MyBatis-SQL映射文件-总结
- 读Zepto源码之Event模块
- js中内存(栈 堆)
- 数组分段和最大值最小问题
- Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
- HDU 4747 线段树 区间更新
- 怎么判断软件公司是否靠谱