// 下面的類共同協作,完成了乙個物件鍊錶
// 任何從asynccall繼承的物件都可以插入鍊錶 ,擁有可定義的fire函式,實現自己的功能,並在鍊錶中依次被調動
// 鍊錶中物件都可自動記錄引用計數
// 基類, 完成記錄次數的自增自減和返回
struct refcountable_
virtual ~recountable_()
// 自增
void refcountreference() const
// 自減
unsigned refcountdereference()const
// 返回
unsigned refcountcount()const
private:
mutable unsigned count_; // 在const裡可以被修改
};#define refcountable virtual refcountable_
template // c 都是從refcountable_繼承 有 次數自增和自減的函式
class refcount // 此類儲存 c類的物件指標 用來管理物件的引用計數
; // 預設建構函式
refcount(c const *p):p_(p) // 一般建構函式
~refcount()
refcount(const refcount &p):p_(p.p_)
// 賦值建構函式 原先物件多一,本
refcount &operator = (const refcount &p)
//對p_成員取反後返回
bool operator !() const
// 取指標取值
c* operator ->()const
c & operator *()const
// 獲取原始指標
c const * getraw()const
c * getraw()
//相等和不等的比較
bool operator == (const refcount &p) const
bool operator != (const refcount &p) const
private:
// 原先指標呼叫refcountdereference 然後釋放,儲存新指標
void dereference(c const *newp_ = null)
}void reference (const refcount &p) }
c const *p_; // c為模板型別
}class asynccall :public refcountable
// 不為空為true 為真取消 ==空 為假
virtual calldialar * getdialar() = 0;
void print(std::ostream &os);
void dequeue(asynccall :: pointer &head, asynccall::pointer &prev);
void setnext(asynccall::pointer anext)
asynccall::pointer &next()
public:
const char*const name;
const int debugsection;
const int debuglevel;
const instanceidid;
protected:
virtual bool canfire();
virtual void fire() = 0;
asynccall :: pointer thenext;
private:
const char *iscanceled;
asynccall();
asynccall(const asynccall &);
}asynccall::asynccall(int adebugsection, int adebuglevel, const char *aname):name(aname),debugsection(adebugsection),thenext(0),iscanceled(null){}
asynccall::~asynccall() // thenext為非空時,就是存在值時,被斷住
void asynccall::make()
if (!iscanceled)
iscanceled = "unknown reason";
}bool asynccall::cancel(const char * reason)
bool asynccall::canfire()
void asynccall::print(std::ostream &os)
class asynccallqueue // 鍊錶的單間類
;asynccallqueue* asynccallqueue::theinstance = null;
asynccallqueue::asynccallqueue():thehead(null),thtail(null){};
// 使用head 和tail 建立鍊錶, head指向煉表頭, tail指向鍊錶尾部
// 插入時在尾部插入,使用asynccall thenext指標指向,然後tail 繼續向後移動。
void asynccallqueue::schedule(asynccall::pointer &call)
else
}bool asynccallqueue::fire()
return made; // 這裡只返回判斷頭是否為空
}// 呼叫頭部synccall物件的make 並把頭指標指向下乙個
void asynccallqueue::firenext()
// 單間物件獲取函式
asynccallqueue & asynccallqueue :: instance()
Koa2原始碼學習
koa 基於 node.js 平台的下一代 web 開發框架 const koa require koa do some thing 以上 構建了乙個簡單的伺服器,你可以在瀏覽器輸入 localhost 8080 來訪問 下面我們通過建立koa伺服器,且傳送一次http請求來了解原始碼 在koa例項...
學習筆記 解讀CppUnit原始碼2
上次我詳細的剖析了與test.h相互關聯的 test類是cppunit的核心。test這個類相信看了上一章就知道,也就起到測試用例的作用,但是畢竟乙個類的功能有限,如何擴充test類的功能呢?下面裝飾者模式就登場了。testdecorator.h 這個類中儲存了乙份test的指標,這個類的count...
Feign學習筆記2 原始碼解讀
spring cloud netflix feign,這個是feign的全名。spring官網上是沒有feign這個專案存在的,feign是作為netflix的乙個子專案存在。netflix包涵eureka zuul ribbon feign hystrix hystrix dashboard tu...