mariadb/sql/scan_char.h
Alexander Barkov 19b7318a63 MDEV-33281 Implement optimizer hints
Implementing a recursive descent parser for optimizer hints.
2025-03-18 18:28:18 +01:00

53 lines
1.8 KiB
C++

/* Copyright (c) 2024, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */
#ifndef SCAN_CHAR_H
#define SCAN_CHAR_H
/**
A helper class to store the head character of a string,
with help of a charlen() call.
*/
class Scan_char
{
const char *m_ptr; // The start of the character
int m_length; // The result:
// >0 - the character octet length
// <=0 - an error (e.g. end of input, wrong byte sequence)
public:
Scan_char(CHARSET_INFO *const cs, const char *str, const char *end)
:m_ptr(str), m_length(cs->charlen(str, end))
{ }
// Compare if two non-erroneous characters are equal
bool eq(const Scan_char &rhs) const
{
DBUG_ASSERT(m_length > 0);
DBUG_ASSERT(rhs.m_length > 0);
return m_length == rhs.m_length &&
!memcmp(m_ptr, rhs.m_ptr, (size_t) m_length);
}
// Compare if two possibly erroneous characters are equal
bool eq_safe(const Scan_char &rhs) const
{
return m_length == rhs.m_length && m_length > 0 &&
!memcmp(m_ptr, rhs.m_ptr, (size_t) m_length);
}
const char *ptr() const { return m_ptr; }
int length() const { return m_length; }
};
#endif // SCAN_CHAR_H