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)) {
- return strcmp_implementation(left, right, cpp::minus<char>{});
+ for (; *left && *left == *right; ++left, ++right)
+ ;
+ return *reinterpret_cast<const unsigned char *>(left) -
+ *reinterpret_cast<const unsigned char *>(right);
}
} // 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)) {
- return strncmp_implementation(left, right, n, cpp::minus<char>{});
+
+ 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);
}
} // 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",
],
)