
/**********************************************************//**
 **
 ** @file data/Store/scursor_impl.h
 **
 ** Copyright (C) 2010  Xpace, LLC.  All rights reserved.
 **
 **************************************************************/


#ifndef XPACE_SCURSOR_IMPL_H
#define XPACE_SCURSOR_IMPL_H

#include "base/types.h"
#include "base/sharedimpl.h"

#include "data/store/scursor.h"

namespace Xpace 
{
  class SCursor::Impl : public SharedImpl
  {
  public:
    static
    Impl* create
      (const Configuration&);

    virtual ~Impl
     () 
    {
    }

    virtual SStatus getContent
      (BytesRef* result)
    = 0;

    virtual SStatus getContent
      (String* result)
    = 0;

    virtual SStatus getContent
      (int64* result)
    = 0;

    virtual SStatus next
      ()
    = 0;

    virtual const Configuration& getNodeConfig
      ()
      const
    = 0;

    virtual uint getID
      ()
    const
    = 0;

    virtual bool classTreeTraverse
      (classTreeDoThis*)
    = 0;

    virtual classTreeNodeInfo getClassTreeNodeInfo
      ()
    = 0;

    virtual bool getPosition
      (Axis,
       uint64* current,
       uint64* last = 0)
      const
    = 0;

    virtual bool move
      (Axis,
       int64 distance)
    = 0;

    virtual bool move
      (bool childNotSibling,
       const String& name,
       int instance = 0)
    = 0;

    virtual bool traverse
      (nodeDoThis&)
    = 0;
  };

  // ==========================================================
  // ==========================================================
  // ==========================================================

  inline
  SCursor::classTreeNodeInfo::classTreeNodeInfo
    (void* ptr) :
      p(ptr)
  {
  }

  inline
  SCursor::classTreeNodeInfo& SCursor::classTreeNodeInfo::operator=
    (void* ptr) 
  {
    p = ptr;
    return *this;
  }

  inline
  SCursor::classTreeNodeInfo::operator void*
    ()
    const
  {
    return p;
  }

  inline
  const Configuration& SCursor::getNodeConfig
   ()
   const
  {
    return impl()->getNodeConfig();
  }

  inline
  uint SCursor::getID
    ()
	   const
  {
    return impl()->getID();
  }

  inline
  bool SCursor::classTreeTraverse
    (SCursor::classTreeDoThis* act)
  {
    return impl()->classTreeTraverse(act);
  }

  inline
  SCursor::classTreeNodeInfo SCursor::getClassTreeNodeInfo
    ()
  {
    return impl()->getClassTreeNodeInfo();
  }

  inline 
  SCursor::SStatus SCursor::getContent
    (BytesRef* result)
  { 
    return impl()->getContent(result);
  }

  inline 
  SCursor::SStatus SCursor::getContent
    (String* result)
  { 
    return impl()->getContent(result);
  }

  inline 
  SCursor::SStatus SCursor::getContent
    (int64* result)
  { 
    return impl()->getContent(result);
  }

  inline 
  SCursor::SStatus SCursor::next
    ()
  { 
    return impl()->next(); 
  }

  inline 
  bool SCursor::getPosition
    (Axis axis,
     uint64* current,
     uint64* last)
    const
  {
    return impl()->getPosition(axis, current, last); 
  }

  inline 
  bool SCursor::move
    (Axis axis,
     int64 distance)
  {
    return impl()->move(axis, distance); 
  }

  inline 
  bool SCursor::move
    (bool childNotSibling,
     const String& name,
     int instance)
  {
    return impl()->move(childNotSibling, name, instance); 
  }

  inline
  bool SCursor::traverse
    (nodeDoThis& doThis)
  {
    return impl()->traverse(doThis);
  }

  // ==========================================================

  SCursor::Impl* createStdCursor
    (const Configuration&);

} // namespace Xpace

#endif

