Let's say that, "hypothetically", I had this code:
//two separate arrays of the same object that for the purposes of this question we will assume are not adjacent in memory
ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];
//and a pointer to a single object
ObjectName* m_pObject = nullptr;
If I wanted to iterate over every object in m_objects0
until I reached the end, then "jump" to the start of m_objects1
to iterate over it, how would I check if the address of m_pObject
sits between the start and end addresses of either array? (my only info being the start and end addresses of each array) Is it even feasible?
The only way I can think of accomplishing it is to somehow convert an address to an int
.
CodePudding user response:
You can check if a given pointer is (in)equal to any other pointer using the ==
and !=
operators.
However, you can check if a given pointer is <(=)
or >(=)
another pointer only when both pointers are pointing within the same object/array, otherwise the behavior is undefined.
So, while m_pObject
is pointing at an element in m_objects0
, you can't check if it is (not) pointing at an element in m_objects1
using address ranges.
However, you can do something like this instead:
ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];
...
ObjectName* object_ptrs[] = {
m_objects0, m_objects0 10,
m_objects1, m_objects1 10
};
for(int i = 0; i < 4; i = 2)
{
ObjectName* m_pObject = object_ptrs[i];
ObjectName* m_pObjects_end = object_ptrs[i 1];
while (m_pObject != m_pObjects_end)
{
...
m_pObject;
}
}
...
Which, you could generalize a bit further (ie, if you needed more than 2 arrays) using something this instead:
#include <vector>
#include <utility>
ObjectName* m_objects0 = new ObjectName[10];
ObjectName* m_objects1 = new ObjectName[10];
...
std::vector<std::pair<ObjectName*,ObjectName*>> object_ptrs;
object_ptrs.emplace_back(m_objects0, m_objects0 10);
object_ptrs.emplace_back(m_objects1, m_objects1 10);
...
for(auto &p : object_ptrs)
{
ObjectName* m_pObject = p.first;
ObjectName* m_pObjects_end = p.second;
while (m_pObject != m_pObjects_end)
{
...
m_pObject;
}
}
...