| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- //
- // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
- //
- // Distributed under the Boost Software License, Version 1.0.
- // https://www.boost.org/LICENSE_1_0.txt
- #ifndef BOOST_LOCALE_BOUNDARY_FACETS_HPP_INCLUDED
- #define BOOST_LOCALE_BOUNDARY_FACETS_HPP_INCLUDED
- #include <boost/locale/boundary/types.hpp>
- #include <locale>
- #include <vector>
- #ifdef BOOST_MSVC
- # pragma warning(push)
- # pragma warning(disable : 4275 4251 4231 4660)
- #endif
- namespace boost { namespace locale {
- /// \brief This namespace contains all operations required for boundary analysis of text
- namespace boundary {
- /// \addtogroup boundary
- ///
- /// @{
- /// \brief This structure is used for representing boundary points
- /// that follow the offset.
- struct break_info {
- /// Create empty break point at beginning
- break_info() : offset(0), rule(0) {}
- /// Create an empty break point at offset v.
- /// it is useful for order comparison with other points.
- break_info(size_t v) : offset(v), rule(0) {}
- /// Offset from the beginning of the text where a break occurs.
- size_t offset;
- /// The identification of this break point according to
- /// various break types
- rule_type rule;
- /// Compare two break points' offset. Allows to search with
- /// standard algorithms over the index.
- bool operator<(const break_info& other) const { return offset < other.offset; }
- };
- /// This type holds the analysis of the text - all its break points
- /// with marks
- typedef std::vector<break_info> index_type;
- template<typename CharType>
- class boundary_indexing;
- #ifdef BOOST_LOCALE_DOXYGEN
- /// \brief This facet generates an index for boundary analysis
- /// for a given text.
- ///
- /// It is specialized for 4 types of characters \c char_t, \c wchar_t, \c char16_t and \c char32_t
- template<typename Char>
- class BOOST_LOCALE_DECL boundary_indexing : public std::locale::facet {
- public:
- /// Default constructor typical for facets
- boundary_indexing(size_t refs = 0) : std::locale::facet(refs) {}
- /// Create index for boundary type \a t for text in range [begin,end)
- ///
- /// The returned value is an index of type \ref index_type. Note that this
- /// index is never empty, even if the range [begin,end) is empty it consists
- /// of at least one boundary point with the offset 0.
- virtual index_type map(boundary_type t, const Char* begin, const Char* end) const = 0;
- /// Identification of this facet
- static std::locale::id id;
- };
- #else
- template<>
- class BOOST_LOCALE_DECL boundary_indexing<char> : public std::locale::facet {
- public:
- boundary_indexing(size_t refs = 0) : std::locale::facet(refs) {}
- ~boundary_indexing();
- virtual index_type map(boundary_type t, const char* begin, const char* end) const = 0;
- static std::locale::id id;
- };
- template<>
- class BOOST_LOCALE_DECL boundary_indexing<wchar_t> : public std::locale::facet {
- public:
- boundary_indexing(size_t refs = 0) : std::locale::facet(refs) {}
- ~boundary_indexing();
- virtual index_type map(boundary_type t, const wchar_t* begin, const wchar_t* end) const = 0;
- static std::locale::id id;
- };
- # ifdef BOOST_LOCALE_ENABLE_CHAR16_T
- template<>
- class BOOST_LOCALE_DECL boundary_indexing<char16_t> : public std::locale::facet {
- public:
- boundary_indexing(size_t refs = 0) : std::locale::facet(refs) {}
- ~boundary_indexing();
- virtual index_type map(boundary_type t, const char16_t* begin, const char16_t* end) const = 0;
- static std::locale::id id;
- };
- # endif
- # ifdef BOOST_LOCALE_ENABLE_CHAR32_T
- template<>
- class BOOST_LOCALE_DECL boundary_indexing<char32_t> : public std::locale::facet {
- public:
- boundary_indexing(size_t refs = 0) : std::locale::facet(refs) {}
- ~boundary_indexing();
- virtual index_type map(boundary_type t, const char32_t* begin, const char32_t* end) const = 0;
- static std::locale::id id;
- };
- # endif
- #endif
- /// @}
- } // namespace boundary
- }} // namespace boost::locale
- #ifdef BOOST_MSVC
- # pragma warning(pop)
- #endif
- #endif
|