/*============================================================================
  KWSys - Kitware System Library
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
#ifndef @KWSYS_NAMESPACE@_Encoding_hxx
#define @KWSYS_NAMESPACE@_Encoding_hxx

#include <@KWSYS_NAMESPACE@/Configure.hxx>
#include <string>
#include <vector>

namespace @KWSYS_NAMESPACE@
{
class @KWSYS_NAMESPACE@_EXPORT Encoding
{
public:

  // Container class for argc/argv.
  class CommandLineArguments
  {
    public:
      // On Windows, get the program command line arguments
      // in this Encoding module's 8 bit encoding.
      // On other platforms the given argc/argv is used, and
      // to be consistent, should be the argc/argv from main().
      static CommandLineArguments Main(int argc, char const* const* argv);

      // Construct CommandLineArguments with the given
      // argc/argv.  It is assumed that the string is already
      // in the encoding used by this module.
      CommandLineArguments(int argc, char const* const* argv);

      // Construct CommandLineArguments with the given
      // argc and wide argv.  This is useful if wmain() is used.
      CommandLineArguments(int argc, wchar_t const* const* argv);
      ~CommandLineArguments();
      CommandLineArguments(const CommandLineArguments&);
      CommandLineArguments& operator=(const CommandLineArguments&);

      int argc() const;
      char const* const* argv() const;

    protected:
      std::vector<char*> argv_;
  };

  /**
   * Convert between char and wchar_t
   */

#if @KWSYS_NAMESPACE@_STL_HAS_WSTRING

  // Convert a narrow string to a wide string.
  // On Windows, UTF-8 is assumed, and on other platforms,
  // the current locale is assumed.
  static std::wstring ToWide(const std::string& str);
  static std::wstring ToWide(const char* str);

  // Convert a wide string to a narrow string.
  // On Windows, UTF-8 is assumed, and on other platforms,
  // the current locale is assumed.
  static std::string ToNarrow(const std::wstring& str);
  static std::string ToNarrow(const wchar_t* str);

#endif // @KWSYS_NAMESPACE@_STL_HAS_WSTRING

}; // class Encoding
} // namespace @KWSYS_NAMESPACE@

#endif
