Skip to content

Commit

Permalink
Remove usage of std::regex
Browse files Browse the repository at this point in the history
  • Loading branch information
rschu1ze committed Jul 8, 2024
1 parent 4c4d2f0 commit be36623
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 105 deletions.
46 changes: 23 additions & 23 deletions include/rocksdb/utilities/object_registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,21 +57,21 @@ class ObjectLibrary {
// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61582 for example
//
// This class is deprecated and will be removed in a future release
class RegexEntry : public Entry {
public:
explicit RegexEntry(const std::string& name) : name_(name) {
Regex::Parse(name, &regex_).PermitUncheckedError();
}

bool Matches(const std::string& target) const override {
return regex_.Matches(target);
}
const char* Name() const override { return name_.c_str(); }

private:
std::string name_;
Regex regex_; // The pattern for this entry
};
/// class RegexEntry : public Entry {
/// public:
/// explicit RegexEntry(const std::string& name) : name_(name) {
/// Regex::Parse(name, &regex_).PermitUncheckedError();
/// }
///
/// bool Matches(const std::string& target) const override {
/// return regex_.Matches(target);
/// }
/// const char* Name() const override { return name_.c_str(); }
///
/// private:
/// std::string name_;
/// Regex regex_; // The pattern for this entry
/// };

public:
// Class for matching target strings to a pattern.
Expand Down Expand Up @@ -248,14 +248,14 @@ class ObjectLibrary {
//
// Deprecated. Will be removed in a major release. Code should use AddFactory
// instead.
template <typename T>
const FactoryFunc<T>& Register(const std::string& pattern,
const FactoryFunc<T>& factory) {
std::unique_ptr<Entry> entry(
new FactoryEntry<T>(new RegexEntry(pattern), factory));
AddFactoryEntry(T::Type(), std::move(entry));
return factory;
}
/// template <typename T>
/// const FactoryFunc<T>& Register(const std::string& pattern,
/// const FactoryFunc<T>& factory) {
/// std::unique_ptr<Entry> entry(
/// new FactoryEntry<T>(new RegexEntry(pattern), factory));
/// AddFactoryEntry(T::Type(), std::move(entry));
/// return factory;
/// }

// Registers the factory with the library for the name.
// If name==target, the factory may be used to create a new object.
Expand Down
82 changes: 41 additions & 41 deletions include/rocksdb/utilities/regex.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,44 +5,44 @@

#pragma once

#ifndef ROCKSDB_LITE

#include <memory>
#include <string>

#include "rocksdb/status.h"

namespace ROCKSDB_NAMESPACE {

// A wrapper for parsed regular expressions. The regex syntax and matching is
// compatible with std::regex.
//
// !!!!!! WARNING !!!!!!: The implementation currently uses std::regex, which
// has terrible performance in some cases, including possible crash due to
// stack overflow. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61582
// for example. Avoid use in production as much as possible.
//
// Internal note: see also TestRegex
class Regex {
public:
// Note: Cannot be constructed with a pattern, so that syntax errors can
// be handled without using exceptions.

// Parse returns OK and saves to `out` when the pattern is valid regex
// syntax (modified ECMAScript), or else returns InvalidArgument.
// See https://en.cppreference.com/w/cpp/regex/ecmascript
static Status Parse(const char *pattern, Regex *out);
static Status Parse(const std::string &pattern, Regex *out);

// Checks that the whole of str is matched by this regex. If called on a
// default-constructed Regex, will trigger assertion failure in DEBUG build
// or return false in release build.
bool Matches(const std::string &str) const;

private:
class Impl;
std::shared_ptr<Impl> impl_; // shared_ptr for simple implementation
};
} // namespace ROCKSDB_NAMESPACE

#endif // ROCKSDB_LITE
/// #ifndef ROCKSDB_LITE
///
/// #include <memory>
/// #include <string>
///
/// #include "rocksdb/status.h"
///
/// namespace ROCKSDB_NAMESPACE {
///
/// // A wrapper for parsed regular expressions. The regex syntax and matching is
/// // compatible with std::regex.
/// //
/// // !!!!!! WARNING !!!!!!: The implementation currently uses std::regex, which
/// // has terrible performance in some cases, including possible crash due to
/// // stack overflow. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61582
/// // for example. Avoid use in production as much as possible.
/// //
/// // Internal note: see also TestRegex
/// class Regex {
/// public:
/// // Note: Cannot be constructed with a pattern, so that syntax errors can
/// // be handled without using exceptions.
///
/// // Parse returns OK and saves to `out` when the pattern is valid regex
/// // syntax (modified ECMAScript), or else returns InvalidArgument.
/// // See https://en.cppreference.com/w/cpp/regex/ecmascript
/// static Status Parse(const char *pattern, Regex *out);
/// static Status Parse(const std::string &pattern, Regex *out);
///
/// // Checks that the whole of str is matched by this regex. If called on a
/// // default-constructed Regex, will trigger assertion failure in DEBUG build
/// // or return false in release build.
/// bool Matches(const std::string &str) const;
///
/// private:
/// class Impl;
/// std::shared_ptr<Impl> impl_; // shared_ptr for simple implementation
/// };
/// } // namespace ROCKSDB_NAMESPACE
///
/// #endif // ROCKSDB_LITE
82 changes: 41 additions & 41 deletions util/regex.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,47 @@
// (found in the LICENSE.Apache file in the root directory).

// LITE not supported here in part because of exception handling
#ifndef ROCKSDB_LITE
/// #ifndef ROCKSDB_LITE

#include "rocksdb/utilities/regex.h"

#include <cassert>
#include <regex>

namespace ROCKSDB_NAMESPACE {

// This section would change for alternate underlying implementations other
// than std::regex.
#if 1
class Regex::Impl : public std::regex {
public:
using std::regex::basic_regex;
};

bool Regex::Matches(const std::string &str) const {
if (impl_) {
return std::regex_match(str, *impl_);
} else {
// Should not call Matches on unset Regex
assert(false);
return false;
}
}

Status Regex::Parse(const std::string &pattern, Regex *out) {
try {
out->impl_.reset(new Impl(pattern));
return Status::OK();
} catch (const std::regex_error &e) {
return Status::InvalidArgument(e.what());
}
}
#endif

Status Regex::Parse(const char *pattern, Regex *out) {
return Parse(std::string(pattern), out);
}

} // namespace ROCKSDB_NAMESPACE

#endif // ROCKSDB_LITE
/// #include <cassert>
/// #include <regex>

/// namespace ROCKSDB_NAMESPACE {
///
/// // This section would change for alternate underlying implementations other
/// // than std::regex.
/// #if 1
/// class Regex::Impl : public std::regex {
/// public:
/// using std::regex::basic_regex;
/// };
///
/// bool Regex::Matches(const std::string &str) const {
/// if (impl_) {
/// return std::regex_match(str, *impl_);
/// } else {
/// // Should not call Matches on unset Regex
/// assert(false);
/// return false;
/// }
/// }
///
/// Status Regex::Parse(const std::string &pattern, Regex *out) {
/// try {
/// out->impl_.reset(new Impl(pattern));
/// return Status::OK();
/// } catch (const std::regex_error &e) {
/// return Status::InvalidArgument(e.what());
/// }
/// }
/// #endif
///
/// Status Regex::Parse(const char *pattern, Regex *out) {
/// return Parse(std::string(pattern), out);
/// }
///
/// } // namespace ROCKSDB_NAMESPACE

/// #endif // ROCKSDB_LITE

0 comments on commit be36623

Please sign in to comment.