[llvm] Create a CharSetConverter class with both iconv and icu support (PR #74516)
Hubert Tong via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 9 14:33:11 PST 2024
================
@@ -0,0 +1,128 @@
+//===-- CharSet.h - Characters set conversion class ---------------*- C++ -*-=//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// This file provides a utility class to convert between different character
+/// set encodings.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_SUPPORT_CHARSET_H
+#define LLVM_SUPPORT_CHARSET_H
+
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Config/config.h"
+#include "llvm/Support/ErrorOr.h"
+
+#include <functional>
+#include <string>
+#include <system_error>
+
+namespace llvm {
+
+template <typename T> class SmallVectorImpl;
+
+namespace details {
+class CharSetConverterImplBase {
+public:
+ virtual ~CharSetConverterImplBase() = default;
+
+ /// Converts a string.
+ /// \param[in] Source source string
+ /// \param[out] Result container for converted string
+ /// \return error code in case something went wrong
+ ///
+ /// The following error codes can occur, among others:
+ /// - std::errc::argument_list_too_long: The result requires more than
+ /// std::numeric_limits<size_t>::max() bytes.
+ /// - std::errc::illegal_byte_sequence: The input contains an invalid
+ /// multibyte sequence.
+ /// - std::errc::invalid_argument: The input contains an incomplete
+ /// multibyte sequence.
+ ///
+ /// If the destination charset is a stateful character set, the shift state
+ /// will be set to the initial state.
+ ///
+ /// In case of an error, the result string contains the successfully converted
+ /// part of the input string.
+ ///
+ virtual std::error_code convert(StringRef Source,
+ SmallVectorImpl<char> &Result) const = 0;
----------------
hubert-reinterpretcast wrote:
The `const` here should be an indication that no "semantic" state change occurs. The implementations appear to have some state (the `iconv` implementation resets if the input length is zero).
If the statefulness is not necessary at this time, then it would help (for the purposes to moving this patch forward) to unconditionally reset the state.
https://github.com/llvm/llvm-project/pull/74516
More information about the llvm-commits
mailing list