📄 shm_dlist.cpp
字号:
/*=================================================================** Copyright (c)2006** All rights reserved.**** 文件名称:ipc_dlist.cpp**** 当前版本:1.1** 作 者:Like** 完成日期:2006-11-24**===================================================================*/#include <stdlib.h>#include <stdio.h>#include "shm_dlist.h"/*****************************************************************// // Based on the current node, get the next node in a dlist // ******************************************************************/ ShmDListIter& ShmDListIter::operator ++ (){ _node = (ShmElem*) MAKE_SHM_PTR(_node->_nextOffset); return *this;}/*****************************************************************// // Calculate the size of memory which a ShmDList needed.// ******************************************************************/ int ShmDList::BaseSpace(){ return sizeof(ShmDListHead);}/*****************************************************************// // Attach to a shared memory// ******************************************************************/ void ShmDList::Attach(char* mem_addr, int flag){ // ------------------------------------------------------------ // size (int) | list head (including prevOffset and nextOffset) // ------------------------------------------------------------ ShmDListHead* list_head = NULL; _location = mem_addr; list_head = (ShmDListHead*) _location; _size = &(list_head->_size); _listHead = &(list_head->_listHead); if (flag == 1) { Init(); } } /*****************************************************************// // 将一个空链表自环。这个函数只能被执行一次。// ******************************************************************/ void ShmDList::Init(){ int list_off = 0; list_off = MAKE_SHM_OFF(_listHead); _listHead->_nextOffset = list_off; _listHead->_prevOffset = list_off; *_size = 0;}/*****************************************************************// // 将一个节点从链表的“头”插入一个节点// ******************************************************************/ void ShmDList::push_back(ShmElem* node){ ShmElem* tail_node = NULL; node->_nextOffset = MAKE_SHM_OFF(_listHead); node->_prevOffset = _listHead->_prevOffset; tail_node = (ShmElem*) MAKE_SHM_PTR(_listHead->_prevOffset); _listHead->_prevOffset = tail_node->_nextOffset = MAKE_SHM_OFF(node); (*_size)++;}/*****************************************************************// // 将一个节点从链表的“尾”插入一个节点// ******************************************************************/ void ShmDList::push_front(ShmElem* node){ ShmElem* next_node = NULL; node->_prevOffset = MAKE_SHM_OFF(_listHead); node->_nextOffset = _listHead->_nextOffset; next_node = (ShmElem*) MAKE_SHM_PTR(_listHead->_nextOffset); _listHead->_nextOffset = next_node->_prevOffset = MAKE_SHM_OFF(node); (*_size)++;}/*****************************************************************// // Delete a node from ShmDList// ******************************************************************/ ShmDListIter ShmDList::erase(ShmDListIter& it){ ShmElem* prev_node = (ShmElem*) MAKE_SHM_PTR(it._node->_prevOffset); ShmElem* next_node = (ShmElem*) MAKE_SHM_PTR(it._node->_nextOffset); prev_node->_nextOffset = it._node->_nextOffset; next_node->_prevOffset = it._node->_prevOffset; (*_size)--; return iterator(next_node); }/*****************************************************************// // As its name, it is used to delete all the nodes from a ShmDList// ******************************************************************/ void ShmDList::clear(){ for (iterator it = begin(); it != end(); ) { it = erase(it); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -