constexpr R operator()(Args... params) { return func(params...); }
};
+template <class T> struct minus {
+ constexpr T operator()(const T &lhs, const T &rhs) const { return lhs - rhs; }
+};
+
} // namespace cpp
} // namespace __llvm_libc
strcmp.cpp
HDRS
strcmp.h
+ DEPENDS
+ .memory_utils.strcmp_implementation
+ libc.src.__support.CPP.functional
)
add_entrypoint_object(
strncmp.cpp
HDRS
strncmp.h
+ DEPENDS
+ .memory_utils.strcmp_implementation
+ libc.src.__support.CPP.functional
)
add_entrypoint_object(
DEPS
.memset_implementation
)
+
+add_header_library(
+ strcmp_implementation
+ HDRS
+ strcmp_implementations.h
+)
--- /dev/null
+//===-- str{,case}cmp implementation ----------------------------*- 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_STRING_MEMORY_UTILS_STRCMP_IMPLEMENTATIONS_H
+#define LLVM_LIBC_SRC_STRING_MEMORY_UTILS_STRCMP_IMPLEMENTATIONS_H
+
+#include <stddef.h>
+
+namespace __llvm_libc {
+
+template <typename Comp>
+constexpr static int strcmp_implementation(const char *left, const char *right,
+ Comp &&comp) {
+ // TODO: Look at benefits for comparing words at a time.
+ for (; *left && !comp(*left, *right); ++left, ++right)
+ ;
+ return comp(*reinterpret_cast<const unsigned char *>(left),
+ *reinterpret_cast<const unsigned char *>(right));
+}
+
+template <typename Comp>
+constexpr static int strncmp_implementation(const char *left, const char *right,
+ size_t n, Comp &&comp) {
+ if (n == 0)
+ return 0;
+
+ // TODO: Look at benefits for comparing words at a time.
+ for (; n > 1; --n, ++left, ++right) {
+ char lc = *left;
+ if (!comp(lc, '\0') || comp(lc, *right))
+ break;
+ }
+ return comp(*reinterpret_cast<const unsigned char *>(left),
+ *reinterpret_cast<const unsigned char *>(right));
+}
+
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_STRING_MEMORY_UTILS_STRCMP_IMPLEMENTATIONS_H
#include "src/string/strcmp.h"
+#include "src/__support/CPP/functional.h"
#include "src/__support/common.h"
+#include "src/string/memory_utils/strcmp_implementations.h"
namespace __llvm_libc {
-// TODO: Look at benefits for comparing words at a time.
LLVM_LIBC_FUNCTION(int, strcmp, (const char *left, const char *right)) {
- for (; *left && *left == *right; ++left, ++right)
- ;
- return *reinterpret_cast<const unsigned char *>(left) -
- *reinterpret_cast<const unsigned char *>(right);
+ return strcmp_implementation(left, right, cpp::minus<char>{});
}
} // namespace __llvm_libc
#include "src/string/strncmp.h"
+#include "src/__support/CPP/functional.h"
#include "src/__support/common.h"
+#include "src/string/memory_utils/strcmp_implementations.h"
+
#include <stddef.h>
namespace __llvm_libc {
-// TODO: Look at benefits for comparing words at a time.
LLVM_LIBC_FUNCTION(int, strncmp,
(const char *left, const char *right, size_t n)) {
-
- if (n == 0)
- return 0;
-
- for (; n > 1; --n, ++left, ++right) {
- char lc = *left;
- if (lc == '\0' || lc != *right)
- break;
- }
- return *reinterpret_cast<const unsigned char *>(left) -
- *reinterpret_cast<const unsigned char *>(right);
+ return strncmp_implementation(left, right, n, cpp::minus<char>{});
}
} // namespace __llvm_libc
"src/string/memory_utils/memcpy_implementations.h",
"src/string/memory_utils/memmove_implementations.h",
"src/string/memory_utils/memset_implementations.h",
+ "src/string/memory_utils/strcmp_implementations.h",
],
deps = [
":__support_common",
hdrs = ["src/string/strcmp.h"],
deps = [
":__support_common",
+ ":__support_cpp_functional",
+ ":string_memory_utils",
":string_utils",
],
)