From 2850d74a8428ae319b0ea2d86fee82c5b4ec9cc3 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Thu, 25 Apr 2013 14:48:07 -0700 Subject: [PATCH] add typedefs for stl iterator implementation --- interface/src/Head.cpp | 2 +- interface/src/main.cpp | 6 ++-- libraries/shared/src/AgentList.cpp | 50 +++++++++++++++++------------- libraries/shared/src/AgentList.h | 11 ++++++- 4 files changed, 43 insertions(+), 26 deletions(-) diff --git a/interface/src/Head.cpp b/interface/src/Head.cpp index ac44e3e530..c4511659df 100644 --- a/interface/src/Head.cpp +++ b/interface/src/Head.cpp @@ -309,7 +309,7 @@ void Head::simulate(float deltaTime) { //_numOtherAvatars = 0; - for(AgentListIterator agent = agentList->begin(); + for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if ((*agent).getLinkedData() != NULL && (*agent).getType() == AGENT_TYPE_AVATAR) { diff --git a/interface/src/main.cpp b/interface/src/main.cpp index 0ede2ed23b..20e6c05491 100644 --- a/interface/src/main.cpp +++ b/interface/src/main.cpp @@ -907,7 +907,7 @@ void display(void) // Render avatars of other agents AgentList *agentList = AgentList::getInstance(); - for(AgentListIterator agent = agentList->begin(); + for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if ((*agent).getLinkedData() != NULL && (*agent).getType() == AGENT_TYPE_AVATAR) { @@ -983,7 +983,7 @@ void display(void) AgentList *agentList = AgentList::getInstance(); int totalAvatars = 0, totalServers = 0; - for (AgentListIterator agent = agentList->begin(); agent != agentList->end(); agent++) { + for (AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { (*agent).getType() == AGENT_TYPE_AVATAR ? totalAvatars++ : totalServers++; } @@ -1490,7 +1490,7 @@ void idle(void) { //loop through all the other avatars and simulate them... AgentList * agentList = AgentList::getInstance(); - for(AgentListIterator agent = agentList->begin(); agent != agentList->end(); agent++) { + for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if ((*agent).getLinkedData() != NULL) { Head *avatar = (Head *)(*agent).getLinkedData(); avatar->simulate(deltaTime); diff --git a/libraries/shared/src/AgentList.cpp b/libraries/shared/src/AgentList.cpp index 809ee2af03..3ba79c4719 100644 --- a/libraries/shared/src/AgentList.cpp +++ b/libraries/shared/src/AgentList.cpp @@ -172,7 +172,7 @@ int AgentList::updateAgentWithData(Agent *agent, unsigned char *packetData, int } Agent* AgentList::agentWithAddress(sockaddr *senderAddress) { - for(AgentListIterator agent = begin(); agent != end(); agent++) { + for(AgentList::iterator agent = begin(); agent != end(); agent++) { if ((*agent).getActiveSocket() != NULL && socketMatch((*agent).getActiveSocket(), senderAddress)) { return &*agent; } @@ -182,7 +182,7 @@ Agent* AgentList::agentWithAddress(sockaddr *senderAddress) { } Agent* AgentList::agentWithID(uint16_t agentID) { - for(AgentListIterator agent = begin(); agent != end(); agent++) { + for(AgentList::iterator agent = begin(); agent != end(); agent++) { if ((*agent).getAgentId() == agentID) { return &*agent; } @@ -227,7 +227,7 @@ int AgentList::updateList(unsigned char *packetData, size_t dataBytes) { } bool AgentList::addOrUpdateAgent(sockaddr *publicSocket, sockaddr *localSocket, char agentType, uint16_t agentId) { - AgentListIterator agent = end(); + AgentList::iterator agent = end(); if (publicSocket != NULL) { for (agent = begin(); agent != end(); agent++) { @@ -291,7 +291,7 @@ void AgentList::addAgentToList(Agent* newAgent) { } void AgentList::broadcastToAgents(unsigned char *broadcastData, size_t dataBytes, const char* agentTypes, int numAgentTypes) { - for(AgentListIterator agent = begin(); agent != end(); agent++) { + for(AgentList::iterator agent = begin(); agent != end(); agent++) { // only send to the AgentTypes we are asked to send to. if ((*agent).getActiveSocket() != NULL && memchr(agentTypes, (*agent).getType(), numAgentTypes)) { // we know which socket is good for this agent, send there @@ -301,7 +301,7 @@ void AgentList::broadcastToAgents(unsigned char *broadcastData, size_t dataBytes } void AgentList::handlePingReply(sockaddr *agentAddress) { - for(AgentListIterator agent = begin(); agent != end(); agent++) { + for(AgentList::iterator agent = begin(); agent != end(); agent++) { // check both the public and local addresses for each agent to see if we find a match // prioritize the private address so that we prune erroneous local matches if (socketMatch((*agent).getPublicSocket(), agentAddress)) { @@ -316,7 +316,7 @@ void AgentList::handlePingReply(sockaddr *agentAddress) { Agent* AgentList::soloAgentOfType(char agentType) { if (memchr(SOLO_AGENT_TYPES, agentType, sizeof(SOLO_AGENT_TYPES)) != NULL) { - for(AgentListIterator agent = begin(); agent != end(); agent++) { + for(AgentList::iterator agent = begin(); agent != end(); agent++) { if ((*agent).getType() == agentType) { return &*agent; } @@ -336,7 +336,7 @@ void *pingUnknownAgents(void *args) { while (!pingUnknownAgentThreadStopFlag) { gettimeofday(&lastSend, NULL); - for(AgentListIterator agent = agentList->begin(); + for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if ((*agent).getActiveSocket() == NULL @@ -374,7 +374,7 @@ void *removeSilentAgents(void *args) { while (!silentAgentThreadStopFlag) { checkTimeUSecs = usecTimestampNow(); - for(AgentListIterator agent = agentList->begin(); agent != agentList->end(); agent++) { + for(AgentList::iterator agent = agentList->begin(); agent != agentList->end(); agent++) { if ((checkTimeUSecs - (*agent).getLastRecvTimeUsecs()) > AGENT_SILENCE_THRESHOLD_USECS && (*agent).getType() != AGENT_TYPE_VOXEL) { @@ -463,7 +463,7 @@ void AgentList::stopDomainServerCheckInThread() { pthread_join(checkInWithDomainServerThread, NULL); } -AgentListIterator AgentList::begin() const { +AgentList::iterator AgentList::begin() const { Agent** agentBucket = NULL; for (int i = 0; i < _numAgents; i++) { @@ -479,7 +479,7 @@ AgentListIterator AgentList::begin() const { return AgentListIterator(this, 0); } -AgentListIterator AgentList::end() const { +AgentList::iterator AgentList::end() const { Agent** agentBucket = _agentBuckets[(_numAgents - 1) / AGENTS_PER_BUCKET]; for (int i = _numAgents - 1; i >= 0; i--) { @@ -520,17 +520,25 @@ Agent& AgentListIterator::operator*() { } AgentListIterator& AgentListIterator::operator++() { - if (*this != _agentList->end()) { - ++_agentIndex; - } - - return (*this); + skipDeadAndStopIncrement(); + return *this; } -AgentListIterator& AgentListIterator::operator++(int) { - if (*this != _agentList->end()) { - ++_agentIndex; - } - - return (*this); +AgentList::iterator AgentListIterator::operator++(int) { + AgentListIterator newIterator = AgentListIterator(*this); + skipDeadAndStopIncrement(); + return newIterator; +} + +void AgentListIterator::skipDeadAndStopIncrement() { + while (*this != _agentList->end()) { + ++_agentIndex; + + if (*this == _agentList->end()) { + break; + } else if ((*(*this)).isAlive()) { + // skip over the dead agents + break; + } + } } diff --git a/libraries/shared/src/AgentList.h b/libraries/shared/src/AgentList.h index 8ac1e984c3..09d69681e3 100644 --- a/libraries/shared/src/AgentList.h +++ b/libraries/shared/src/AgentList.h @@ -37,6 +37,13 @@ class AgentList { public: static AgentList* createInstance(char ownerType, unsigned int socketListenPort = AGENT_SOCKET_LISTEN_PORT); static AgentList* getInstance(); + + typedef AgentListIterator iterator; + typedef ptrdiff_t difference_type; + typedef size_t size_type; + typedef Agent value_type; + typedef Agent * pointer; + typedef Agent & reference; AgentListIterator begin() const; AgentListIterator end() const; @@ -114,8 +121,10 @@ public: Agent& operator*(); AgentListIterator& operator++(); - AgentListIterator& operator++(int); + AgentListIterator operator++(int); private: + void skipDeadAndStopIncrement(); + const AgentList* _agentList; int _agentIndex; };