string实现
目标:
1.string接口纯虚函数类StringInterface;
2.我的ubuntu上string实现重写(但不包括写时复制);
3.一种支持小字符串优化的实现;
4.基于StringInterface的多态测试case集合;
6.多场景性能分析。
当前时间不太够,只差不多完成了1\2,先放到博客备忘,之后补上。
string_interface.h
//#define MYCODE_TEST_MODE 1
#ifndef MYCODE_STRING_INTERFACE_H
#include
namespace mycode{
//缺点:用全部纯虚的interface不是好事,造成了string的各种实现的对应函数也是虚的,而实际上string的各种实现不应该有子类了,所以对于string指针或引用的函数调用运行时查虚函数表是不必要的浪费。
//优点:用interface可以使得接口统一且没有遗漏,并且通过多态进行测试也比较方便
//实现可以不继承全部接口,也可以继承,可以用一个定义开关MYCODE_TEST_MODE控制
//限定符,最好都加,1.简单的文档;2.防止错误的调用;3.编译器可能的优化;4.库可能的优化;5.编译器警告。这些里面1最重要。
//线程安全不考虑,异常安全按注释,提供基本及以上保证。
class StringInterface{
public:
static const size_t nopos = (size_t)-1;
//迭代器,假设实现全是用连续内存实现的,这样"迭代器"生成比较方便,因为迭代器兼容指针并且当作最高级的迭代器(random)
//“长度类”接口
//位置相关函数
//操作相关
//操作符重载
//std::swap也需要加特化版本
//改变类
//析构函数
//此外,拷贝构造函数、右值拷贝构造函数,左右值赋值操作符;友元函数的输入输出也应该实现;这些貌似没法纯虚了。
//除了这个VIRTUAL StringInterface substr(size_t pos,size_t len) const noexcept(false) PUREVIRTUAL;其他还是能实现。
#define MYCODE_STRING_INTERFACE \
VIRTUAL char *begin() noexcept PUREVIRTUAL; \
VIRTUAL char *end() noexcept PUREVIRTUAL; \
VIRTUAL const char *cbegin() const noexcept PUREVIRTUAL; \
VIRTUAL const char *cend() const noexcept PUREVIRTUAL; \
\
VIRTUAL size_t size() const noexcept PUREVIRTUAL; \
VIRTUAL size_t capacity() const noexcept PUREVIRTUAL; \
VIRTUAL void resize(size_t) noexcept(false) PUREVIRTUAL; \
VIRTUAL bool empty() const noexcept PUREVIRTUAL; \
VIRTUAL void reserve(size_t) noexcept(false) PUREVIRTUAL; \
VIRTUAL void shrink_to_fit() noexcept(false) PUREVIRTUAL; \
\
VIRTUAL char &operator[](size_t pos) noexcept(false) PUREVIRTUAL; \
VIRTUAL const char &operator[](size_t pos) const noexcept(false) PUREVIRTUAL; \
VIRTUAL char &back() noexcept(false) PUREVIRTUAL; \
VIRTUAL const char &back() const noexcept(false) PUREVIRTUAL; \
\
VIRTUAL size_t find_first_of(char c) const noexcept PUREVIRTUAL; \
VIRTUAL const char *c_str() const noexcept PUREVIRTUAL; \
VIRTUAL int compare(const StringInterface &si) const noexcept PUREVIRTUAL; \
VIRTUAL size_t find(const StringInterface &si) const noexcept PUREVIRTUAL; \
\
VIRTUAL bool operator==(const StringInterface &lhs) const noexcept PUREVIRTUAL; \
VIRTUAL bool operator<(const StringInterface &lhs) const noexcept PUREVIRTUAL; \
VIRTUAL bool operator>(const StringInterface &lhs) const noexcept PUREVIRTUAL; \
VIRTUAL bool operator!=(const StringInterface &lhs) const noexcept PUREVIRTUAL; \
VIRTUAL void swap(StringInterface &lhs) noexcept PUREVIRTUAL; \
\
VIRTUAL void push_back(char c) noexcept(false) PUREVIRTUAL; \
VIRTUAL void pop_back() noexcept PUREVIRTUAL; \
VIRTUAL void insert(size_t pos,char c) noexcept(false) PUREVIRTUAL; \
VIRTUAL void erase(size_t pos) noexcept(false) PUREVIRTUAL;
#ifdef MYCODE_TEST_MODE
#define VIRTUAL virtual
#define PUREVIRTUAL = 0
public:
MYCODE_STRING_INTERFACE
VIRTUAL ~StringInterface() noexcept {};
#undef VIRTUAL
#undef PUREVIRTUAL
#endif
#define VIRTUAL
#define PUREVIRTUAL
};
}
#define MYCODE_STRING_INTERFACE_H