text: /* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
     file Copyright.txt or https://cmake.org/licensing for details.  */
  #ifndef cm_codecvt_hxx
  #define cm_codecvt_hxx
  
  #include "cmConfigure.h" // IWYU pragma: keep
  
  #include <locale>
  #include <wchar.h>
  
  class codecvt : public std::codecvt<char, char, mbstate_t>
  {
  public:
    enum Encoding
    {
      None,
      UTF8,
      ANSI
    };
  
  #ifdef CMAKE_BUILD_WITH_CMAKE
  
    codecvt(Encoding e);
  
  protected:
    ~codecvt() override;
    bool do_always_noconv() const throw() override;
    result do_out(mbstate_t& state, const char* from, const char* from_end,
                  const char*& from_next, char* to, char* to_end,
                  char*& to_next) const override;
    result do_unshift(mbstate_t& state, char* to, char*,
                      char*& to_next) const override;
    int do_max_length() const throw() override;
    int do_encoding() const throw() override;
  
  private:
    // The mbstate_t argument to do_out and do_unshift is responsible
    // for storing state between calls.  We cannot control the type
    // since we want to imbue on standard streams.  However, we do
    // know that it is a trivial type.  Define our own type to overlay
    // on it safely with no alignment requirements.
    struct State
    {
      // Buffer bytes we have consumed from a partial codepoint.
      char partial[3];
  
      // Number of bytes we have buffered from a partial codepoint.
      unsigned char buffered : 4;
  
      // Size of the current codepoint in bytes.
      unsigned char size : 4;
    };
  
    bool m_noconv;
  #  if defined(_WIN32)
    unsigned int m_codepage;
    result Decode(mbstate_t& state, int need, const char*& from_next,
                  char*& to_next, char* to_end) const;
    result DecodePartial(mbstate_t& state, char*& to_next, char* to_end) const;
    void BufferPartial(mbstate_t& state, int need, const char*& from_next) const;
  #  endif
  
  #endif
  };
  
  #endif
  