/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing#kwsys for details.  */
#ifndef @KWSYS_NAMESPACE@_IOStream_hxx
#define @KWSYS_NAMESPACE@_IOStream_hxx

#include <iosfwd>

/* Define these macros temporarily to keep the code readable.  */
#if !defined(KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
#  define kwsysEXPORT @KWSYS_NAMESPACE@_EXPORT
#endif

/* Whether istream supports long long.  */
#define @KWSYS_NAMESPACE@_IOS_HAS_ISTREAM_LONG_LONG                           \
  @KWSYS_IOS_HAS_ISTREAM_LONG_LONG@

/* Whether ostream supports long long.  */
#define @KWSYS_NAMESPACE@_IOS_HAS_OSTREAM_LONG_LONG                           \
  @KWSYS_IOS_HAS_OSTREAM_LONG_LONG@

/* Determine whether we need to define the streaming operators for
   long long or __int64.  */
#if @KWSYS_USE_LONG_LONG@
#  if !@KWSYS_NAMESPACE@_IOS_HAS_ISTREAM_LONG_LONG ||                         \
    !@KWSYS_NAMESPACE@_IOS_HAS_OSTREAM_LONG_LONG
#    define @KWSYS_NAMESPACE@_IOS_NEED_OPERATORS_LL 1
namespace @KWSYS_NAMESPACE@ {
typedef long long IOStreamSLL;
typedef unsigned long long IOStreamULL;
}
#  endif
#elif defined(_MSC_VER) && _MSC_VER < 1300
#  define @KWSYS_NAMESPACE@_IOS_NEED_OPERATORS_LL 1
namespace @KWSYS_NAMESPACE@ {
typedef __int64 IOStreamSLL;
typedef unsigned __int64 IOStreamULL;
}
#endif
#if !defined(@KWSYS_NAMESPACE@_IOS_NEED_OPERATORS_LL)
#  define @KWSYS_NAMESPACE@_IOS_NEED_OPERATORS_LL 0
#endif

#if @KWSYS_NAMESPACE@_IOS_NEED_OPERATORS_LL
#  if !@KWSYS_NAMESPACE@_IOS_HAS_ISTREAM_LONG_LONG

/* Input stream operator implementation functions.  */
namespace @KWSYS_NAMESPACE@ {
kwsysEXPORT std::istream& IOStreamScan(std::istream&, IOStreamSLL&);
kwsysEXPORT std::istream& IOStreamScan(std::istream&, IOStreamULL&);
}

/* Provide input stream operator for long long.  */
#    if !defined(@KWSYS_NAMESPACE@_IOS_NO_ISTREAM_LONG_LONG) &&               \
      !defined(KWSYS_IOS_ISTREAM_LONG_LONG_DEFINED)
#      define KWSYS_IOS_ISTREAM_LONG_LONG_DEFINED
#      define @KWSYS_NAMESPACE@_IOS_ISTREAM_LONG_LONG_DEFINED
inline std::istream& operator>>(std::istream& is,
                                @KWSYS_NAMESPACE@::IOStreamSLL& value)
{
  return @KWSYS_NAMESPACE@::IOStreamScan(is, value);
}
#    endif

/* Provide input stream operator for unsigned long long.  */
#    if !defined(@KWSYS_NAMESPACE@_IOS_NO_ISTREAM_UNSIGNED_LONG_LONG) &&      \
      !defined(KWSYS_IOS_ISTREAM_UNSIGNED_LONG_LONG_DEFINED)
#      define KWSYS_IOS_ISTREAM_UNSIGNED_LONG_LONG_DEFINED
#      define @KWSYS_NAMESPACE@_IOS_ISTREAM_UNSIGNED_LONG_LONG_DEFINED
inline std::istream& operator>>(std::istream& is,
                                @KWSYS_NAMESPACE@::IOStreamULL& value)
{
  return @KWSYS_NAMESPACE@::IOStreamScan(is, value);
}
#    endif
#  endif /* !@KWSYS_NAMESPACE@_IOS_HAS_ISTREAM_LONG_LONG */

#  if !@KWSYS_NAMESPACE@_IOS_HAS_OSTREAM_LONG_LONG

/* Output stream operator implementation functions.  */
namespace @KWSYS_NAMESPACE@ {
kwsysEXPORT std::ostream& IOStreamPrint(std::ostream&, IOStreamSLL);
kwsysEXPORT std::ostream& IOStreamPrint(std::ostream&, IOStreamULL);
}

/* Provide output stream operator for long long.  */
#    if !defined(@KWSYS_NAMESPACE@_IOS_NO_OSTREAM_LONG_LONG) &&               \
      !defined(KWSYS_IOS_OSTREAM_LONG_LONG_DEFINED)
#      define KWSYS_IOS_OSTREAM_LONG_LONG_DEFINED
#      define @KWSYS_NAMESPACE@_IOS_OSTREAM_LONG_LONG_DEFINED
inline std::ostream& operator<<(std::ostream& os,
                                @KWSYS_NAMESPACE@::IOStreamSLL value)
{
  return @KWSYS_NAMESPACE@::IOStreamPrint(os, value);
}
#    endif

/* Provide output stream operator for unsigned long long.  */
#    if !defined(@KWSYS_NAMESPACE@_IOS_NO_OSTREAM_UNSIGNED_LONG_LONG) &&      \
      !defined(KWSYS_IOS_OSTREAM_UNSIGNED_LONG_LONG_DEFINED)
#      define KWSYS_IOS_OSTREAM_UNSIGNED_LONG_LONG_DEFINED
#      define @KWSYS_NAMESPACE@_IOS_OSTREAM_UNSIGNED_LONG_LONG_DEFINED
inline std::ostream& operator<<(std::ostream& os,
                                @KWSYS_NAMESPACE@::IOStreamULL value)
{
  return @KWSYS_NAMESPACE@::IOStreamPrint(os, value);
}
#    endif
#  endif /* !@KWSYS_NAMESPACE@_IOS_HAS_OSTREAM_LONG_LONG */
#endif   /* @KWSYS_NAMESPACE@_IOS_NEED_OPERATORS_LL */

/* Undefine temporary macros.  */
#if !defined(KWSYS_NAMESPACE) && !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
#  undef kwsysEXPORT
#endif

/* If building a C++ file in kwsys itself, give the source file
   access to the macros without a configured namespace.  */
#if defined(KWSYS_NAMESPACE)
#  define KWSYS_IOS_HAS_ISTREAM_LONG_LONG                                     \
    @KWSYS_NAMESPACE@_IOS_HAS_ISTREAM_LONG_LONG
#  define KWSYS_IOS_HAS_OSTREAM_LONG_LONG                                     \
    @KWSYS_NAMESPACE@_IOS_HAS_OSTREAM_LONG_LONG
#  define KWSYS_IOS_NEED_OPERATORS_LL @KWSYS_NAMESPACE@_IOS_NEED_OPERATORS_LL
#endif

#endif
