anchor.diff:  ``containsItems()`` is used to check for the existence of items of a given type
   in a given frame.
   [source,c++]
  -
   ----
   const bool contains = g.containsItems<envire::core::Item<boost::shared_ptr<octomap::AbstractOcTree>>>(frame);
   ----
  -
   If the type is not known at compile time, there is also an overload that
   accepts ``std::type_index``. You can get the type index by calling
   ``getTypeIndex()`` on any ``Item``.
  -
   [source,c++]
   ----
   const std::type_index index(octree->getTypeIndex());
   const bool contains2 = g.containsItems(frame, index);
   ----
  -
   
   ==== Accessing Items with Iterators
   
   The ``ItemIterator`` can be used to iterate over all items of a specific type
   in a frame. The iterator internally takes care of the necessary type casting
   and type checks.
  -
   [source,c++]
   ----
   using OcTreeItem = envire::core::Item<boost::shared_ptr<octomap::AbstractOcTree>>;
  
positive.code: #include <envire_core/items/Item.hpp>
  #include <octomap/AbstractOcTree.h>
  ----
  
  [source,c++]
  ----
  envire::core::Item<boost::shared_ptr<octomap::AbstractOcTree>>::Ptr octree;
  
negative.code: Once the item is loaded, there are two ways to add it to the graph.
  The common way is to add it using ``addItemToFrame()``:
  [source,c++]
  ----
  g.addItemToFrame(frame, octree);
  ----
  The item will remember the frame that it was added to. I.e. an item cannot be part of two frames at the same time.
  
  It is also possible to set the frame id beforehand and add the item using
  ``addItem()``.
  [source,c++]
  ----
  octree->setFrame(frame);
  g.addItem(octree);
  ----
  The item type can be a ``boost::shared_ptr`` to any subclass of ``ItemBase``.
  Item contains a typedef ``Ptr`` to make working with the pointer more convenient.
  [source,c++]
  ----
  envire::core::Item<...>::Ptr p;
  ----
  