Making StreamIndexedIO::Node work as MemberData, where it holds a pointer to the global Index and to the low level DirectoryNode.
Adding a specific class for DirectoryNode that holds the information loaded from the index.
Adding a member m_nodeType in NodeBase to distinguish derived classes without adding virtual methods.
Replacing the std::map to a sorted vector and sorting by the m_name field.
Using char instead of the enums in the structs to compact members in one word.
Original struct sizes were StreamIndexedIO::Node 104 bytes and DataNode was 56.
Current struct sizes are DirectoryNode 56 and DataNode 40 bytes.
Changing StreamIndexedIO member from intrusive pointer to raw pointer.
This does not affect the class size and should not break binary compatibility.
As a consequence the Node class reduced from 32 bytes to 16 bytes (not derived from RefCounted anymore).
Fixing bug by checking if pointer is valid. Now all tests passing.
Adding SmallDataNode class (24 bytes long on 64bit machines) when the data is small enough and avoid the big DataNode struct (40 bytes).
Updating comment.
Adding a compact Node class for representing non-expanded subIndexes: SubIndexNode (24 bytes).

This helps on the memory requirements for opening a file with a large amount of stored Objects. In particular, large LinkedScenes.
Bug fix: considering the new SubIndexNode a IndexedIO::Directory node for the purposes of filtering child entries by type.
Being more frugal on the usage of the mutex that controls access to the hierarchy of Nodes.

Added a boolean in each Directory node that will be true only if there's a child that is SubIndex and only uses mutex on these locations.
Also, avoids keeping the mutex locked while reading the subindex or during deallocation of duplicated Directories.
Removing conditional on delete.
Documented unused member in IECorePython WrapperGarbageCollector.

It can be removed for Cortex 9.
Added todo to remove unnecessary parts of RefCounted binding API.
Added an improved Python wrapping mechanism.

There is significant overhead in acquiring the GIL and entering python looking for virtual method overrides, and this has been showing up in several profiles recently, and also badly affecting thread scaling. Often the overhead was being incurred for classes which were wrapped but for instanced which weren't actually subclassed in python or defining any overrides.

This new mechanism detects whether or not an object is subclassed in Python at construction, and avoids ever entering Python looking for overrides for non-subclassed objects. It also avoids creating reference cycles and the associated garbage collection in this case.

Additionally, the provision of wrapper classes specific to different base classes makes wrapping a large class hierarchy much easier and less error prone. The RunTimeTypedWrapper automatically adds the appropriate virtual method forwarders whereas before every piece of wrapping code had to manually insert the IECOREPYTHON_RUNTIMETYPEDWRAPPERFNS macro. This style of wrapping has been in use in Gaffer for a while and has worked well there.

Currently, none of the existing Cortex bindings are using the new wrapping mechanism - for now it is intended to be used in Gaffer first where the performance benefits will be felt the most.
Added todos for removing the old wrapping mechanism.
Protecing member variables from the Node classes.
Adding some comments to explain better the rationale behind them.
Replaced intrusive pointer with raw pointer in RefCounted isSame().

Intrusive pointers come at a cost, and there's no need to use them here.
Added RefCounted equality and inequality bindings.

Prior to this we were relying on the built in Python defaults, which compared equal only between the exact same python objects. Since we can't guarantee that a single RefCounted object is always represented by only one Python object, this default doesn't always give us the right answer. This has always been a problem for non-wrapped objects, but is now a problem even for wrapped classes if they use the new style wrappers and haven't been subclassed in Python. Ideally in the future we'll fix the object identity problem once and for all, for both wrapped and non-wrapped objects, but for now this is a good improvement.
Added RefCounted __hash__ binding.

The default hash is based on the address of the Python object, basing it on the address of the underlying C++ object prevents issues caused by two python objects referencing the same underlying RefCounted object.
Fixed compiling on Linux Mint 16

I had to delete a lot of code that was defined but not used, and
probably broke something in the process. I don't know exactly where to
begin testing to make sure I didn't break anything, so any feedback
would be appreciated. Otherwise, Cortex *seems* to compile fine on my
machine.
Merge pull request #228 from ldmoser/streamIndexedIOrawNodes

Reducing memory footprint in StreamIndexedIO