I am designing an input iterator type that enumerates all running processes in a system.
This is similar to an iterator I designed to enumerate modules in a process. The module iterator takes a ‘process’ object in the constructor, and a default constructed iterator is considered to be the off-the-end iterator.
Example:
hadesmem::ModuleIterator beg(process);
hadesmem::ModuleIterator end;
assert(beg != end);
I do not know what to do about process enumeration though, because there is no ‘state’ or information that needs to be given to the iterator (everything is handled internally by the iterator using the Windows API).
Example:
// This is obviously a broken design, what is the best way to distinguish between the two?
hadesmem::ProcessIterator beg;
hadesmem::ProcessIterator end;
What is the idiomatic way to deal with this situation? i.e. Where you need to distinguish between the creation of a ‘new’ iterator and an off-the-end iterator when nothing needs to be given to the iterator constructor.
If it’s relevant, I am able to use C++11 in this library, as long as it’s supported by VC11, GCC 4.7, and ICC 12.1.
Thanks.
EDIT:
To clarify, I know that it’s not possible to distinguish between the two in the form I’ve posted above, so what I’m asking is more of a ‘design’ question than anything else… Maybe I’m just overlooking something obvious though (wouldn’t be the first time).
If you create a class that holds the parameters that go into the
CreateToolhelp32Snapshot()representing the snapshot you’re iterating over, you’ll have a natural factory for the iterators. Something like this should work (I’m not on Windows, so not tested):Usage: