
/**********************************************************//**
 **
 ** @file base/sharedvoid.h
 **
 ** Copyright (C) 2010  Xpace, LLC.  All rights reserved
 **
 ** www.xpace.net
 **
 **************************************************************/


#if !defined XPACE_SHAREDVOID_H
#define XPACE_SHAREDVOID_H

#include "base/types.h"

namespace Xpace
{
  /// an anonymous pointer, used only in conjunction with SharedImplPointer
  class XPACE_EXPORT SharedVoidPointer
  {
  public :
    // @param p the pointer to wrap
    explicit SharedVoidPointer
      (void* p);
    SharedVoidPointer
      ();
    SharedVoidPointer
      (const SharedVoidPointer &rhs);
    SharedVoidPointer& operator=
      (const SharedVoidPointer &rhs);
    ~SharedVoidPointer
      ();

    SharedVoidPointer& operator=
      (void* p);

    /// @return true if null
    bool operator!
      ()
      const;

    /// @return a writable pointer
    void* data
      (bool cached); 

    /// @return a non-writable pointer
    const void* data
      ()
      const;

    /// @return a non-writable pointer (even if object is non-const)
    const void* constData
      () 
      const;

    #ifndef NDEBUG
    int getRefCount
      ()
	  const;
    #endif

  private:
    void* d;

    void _trace
      (const char*)
    #ifndef TRACE_SHARE
    {
    }
    #endif
    ;

    static void _trace
      (const char*,
       const void*)
    #ifndef TRACE_SHARE
    {
    }
    #endif
    ;
  };

  // ==========================================================
  // ==========================================================
  // ==========================================================

  inline
  SharedVoidPointer::SharedVoidPointer
    () :
      d(0)
  {
  }

  inline
  bool SharedVoidPointer::operator!
    ()
    const
  { 
    return !d; 
  }

  inline
  const void* SharedVoidPointer::data
    ()
    const
  { 
    return d; 
  }
    
  inline
  const void* SharedVoidPointer::constData
    () 
    const
  { 
    return d; 
  }
};

#endif
