Angel 3.2
A 2D Game Prototyping Engine
RenderableIterator.cpp
1 
2 // Copyright (C) 2008-2013, Shane Liesegang
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of the copyright holder nor the names of any
14 // contributors may be used to endorse or promote products derived from
15 // this software without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 // POSSIBILITY OF SUCH DAMAGE.
29 
30 #include "stdafx.h"
31 #include "../Infrastructure/RenderableIterator.h"
32 
33 #include "../Infrastructure/World.h"
34 
35 RenderableIterator& RenderableIterator::begin()
36 {
37  if (theWorld.GetLayers().size() == 0)
38  {
39  return end();
40  }
41  _layerIterator = theWorld.GetLayers().begin();
42  while ((_layerIterator->second.size() == 0))
43  {
44  if (_layerIterator == theWorld.GetLayers().end())
45  {
46  return end();
47  }
48  _layerIterator++;
49  }
50  _myIterator = _layerIterator->second.begin();
51  _ptr = *_myIterator;
52  return *this;
53 }
54 
55 RenderableIterator& RenderableIterator::end()
56 {
57  _ptr = 0;
58  return *this;
59 }
60 
61 bool RenderableIterator::operator!=( const RenderableIterator& iter ) const
62 {
63  return ( _ptr != iter._ptr );
64 }
65 
66 RenderableIterator& RenderableIterator::erase( RenderableIterator& item_to_remove )
67 {
68  Renderable* pValueToErase = *item_to_remove;
69 
70  RenderLayers::iterator layerElements = theWorld.GetLayers().find( pValueToErase->GetLayer() );
71  if (layerElements != theWorld.GetLayers().end())
72  {
73  RenderList::iterator element = (*layerElements).second.begin();
74 
75  while ( element != (*layerElements).second.end() )
76  {
77  if ( *element == pValueToErase)
78  {
79  _myIterator = (*layerElements).second.erase(element);
80 
81  // Have to force to next layer.
82  // Let our ++ operator do it's magic.
83  if ( _myIterator == (*layerElements).second.end() )
84  {
85  ++item_to_remove;
86  }
87  else
88  {
89  _ptr = *_myIterator;
90  }
91 
92  return *this;
93  }
94  ++element;
95  }
96  }
97  return *this;
98 }
99 
100 const RenderableIterator& RenderableIterator::operator++()
101 {
102  if (_myIterator == _layerIterator->second.end())
103  {
104  if (_layerIterator == theWorld.GetLayers().end())
105  {
106  _ptr = 0;
107  return *this;
108  }
109  }
110  else
111  ++_myIterator;
112 
113  // See if we've reached the end of the vector for the current layer.
114  if (_myIterator == _layerIterator->second.end())
115  {
116  ++_layerIterator;
117  // Go through layers until you reach the end or a non-empty layer.
118  while (_layerIterator != theWorld.GetLayers().end() && _layerIterator->second.size() == 0)
119  ++_layerIterator;
120 
121  if (_layerIterator != theWorld.GetLayers().end() && _layerIterator->second.size() > 0)
122  {
123  _myIterator = _layerIterator->second.begin();
124  }
125  else
126  _ptr = NULL;
127  }
128  if (_ptr)
129  _ptr = *_myIterator;
130 
131  return *this;
132 }