/*! @file

    @id $Id$
*/
//       1         2         3         4         5         6         7         8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890

#ifndef __MRW__CHECKCXX11__
#define __MRW__CHECKCXX11__

// check if code is compiled with a new C++11 compiler
// otherwise there is a fallback wich makes everything much more compliacted
#  ifndef MRW__OLD_PRE11_COMPILER
#    if __cplusplus < 201103L
#      if __cplusplus==1
#        if __APPLE__
#          if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9
             /// Code is compiled with old non C++11 standard compliant compiler
             /** There are workarounds for old non C++11 compatible
                 compilers. These workarounds are deprecated, but will
                 remain until most compilers fully support C++11. So
                 this workaround will be removed in future releases,
                 when support for C++11 is more common. Only rely on
                 this workaround, if you really have to.  Mac gcc is
                 even worse than on other systems. */
#            define MRW__OLD_PRE11_COMPILER
#            warning you need a C++11 compliant compiler, on gcc: add -std=c++11
#            warning emulating C++11 - this changes the way you use the library
#            warning this is deprecated and will be removed in future releases
#            warning refere to the library documentation for more details
#          endif
#        else
           // __cplusplus==1 is a known bug in gcc 4.6.3
#          warning your compiler has a know bug, please upgrade to gcc >= 4.7
#          warning "see __cplusplus in http://gcc.gnu.org/gcc-4.7/changes.html"
#      endif
#    else
       /// Code is compiled with an old non C++11 standard compliant compiler
       /** There are workarounds for old non C++11 compatible
           compilers. These workarounds are deprecated, but will
           remain until most compilers fully support C++11. So this
           workaround will be removed in future releases, when support
           for C++11 is more common. Only rely on this workaround, if
           you really have to. */
#      define MRW__OLD_PRE11_COMPILER
#      warning you need a C++11 compliant compiler, on gcc: add -std=c++11
#      warning emulating C++11 - this changes the way you use the library
#      warning this is deprecated and will be removed in future releases
#      warning refere to the library documentation for more details
#    endif
#  endif

#  ifdef MRW__OLD_PRE11_COMPILER
#    if __cplusplus<200300L
#      warning emulating C++11 support using boost
#      include <boost/shared_ptr.hpp>
namespace std {
  // there is no std::shared_ptr in pre C++11 compilers, so we use the
  // one from the boost library as a 1:1 replacement
  template <typename T> class shared_ptr: public boost::shared_ptr<T> {
    public:
      explicit shared_ptr(): boost::shared_ptr<T>() {}
      explicit shared_ptr(T* p): boost::shared_ptr<T>(p) {}
  };
  // auto_ptr is deprecated in favour of unique_ptr, simulate unique_ptr
  template <typename T> class unique_ptr: public std::auto_ptr<T> {
    public:
      explicit unique_ptr(): auto_ptr<T>() {}
      explicit unique_ptr(T* p): auto_ptr<T>(p) {}
  };
};
#    else
#      warning trying standard C++11 support
#      include <memory>
#    endif
#  elif __APPLE__ && MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9
     /// Code is compiled with an old non C++11 standard compliant compiler
     /** There are workarounds for old non C++11 compatible
         compilers. These workarounds are deprecated, but will remain
         until most compilers fully support C++11. So this workaround
         will be removed in future releases, when support for C++11 is
         more common. Only rely on this workaround, if you really have
         to. */
#    define MRW__OLD_PRE11_COMPILER
#    warning you need a C++11 compliant compiler, on gcc: add -std=c++11
#    warning emulating C++11 - this changes the way you use the library
#    warning this is deprecated and will be removed in future releases
#    warning refere to the library documentation for more details
#    warning special workaround for apple
#    include <tr1/memory>
     namespace std {
       // there is no std::shared_ptr in apple, but
       // std::tr1::shared_ptr in <tr1/memory>
       template <typename T> class shared_ptr: public tr1::shared_ptr<T> {
         public:
           explicit shared_ptr(): tr1::shared_ptr<T>() {}
           explicit shared_ptr(T* p): tr1::shared_ptr<T>(p) {}
       };
     }
#    endif
#  else
#    include <memory>
#  endif

#endif
