| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 | ////  Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)////  Distributed under the Boost Software License, Version 1.0. (See//  accompanying file LICENSE_1_0.txt or copy at//  http://www.boost.org/LICENSE_1_0.txt)//#ifndef BOOST_LOCALE_BOUNDARY_BOUNDARY_POINT_HPP_INCLUDED#define BOOST_LOCALE_BOUNDARY_BOUNDARY_POINT_HPP_INCLUDED#include <boost/locale/boundary/types.hpp>namespace boost {namespace locale {namespace boundary {    ///    /// \addtogroup boundary    /// @{    ///    /// \brief This class represents a boundary point in the text.     ///    /// It represents a pair - an iterator and a rule that defines this     /// point.    ///    /// This type of object is dereference by the iterators of boundary_point_index. Using a rule()    /// member function you can get the reason why this specific boundary point was selected.     ///    /// For example, When you use a sentence boundary analysis, the (rule() & \ref sentence_term) != 0 means    /// that this boundary point was selected because a sentence terminator (like .?!) was spotted    /// and the (rule() & \ref sentence_sep)!=0 means that a separator like line feed or carriage    /// return was observed.    ///    /// \note    ///    /// -   The beginning of analyzed range is always considered a boundary point and its rule is always 0.    /// -   when using a word boundary analysis the returned rule relates to a chunk of text preceding    ///     this point.    ///    /// \see    ///    /// -   \ref boundary_point_index    /// -   \ref segment    /// -   \ref segment_index    ///    template<typename IteratorType>    class boundary_point  {    public:        ///        /// The type of the base iterator that iterates the original text        ///        typedef IteratorType iterator_type;        ///        /// Empty default constructor        ///        boundary_point() : rule_(0) {}                ///        /// Create a new boundary_point using iterator \p and a rule \a r        ///        boundary_point(iterator_type p,rule_type r) :            iterator_(p),            rule_(r)        {        }        ///        /// Set an new iterator value \a i        ///        void iterator(iterator_type i)        {            iterator_ = i;        }        ///        /// Set an new rule value \a r        ///        void rule(rule_type r)        {            rule_ = r;        }        ///        /// Fetch an iterator        ///        iterator_type iterator() const         {            return iterator_;        }        ///        /// Fetch a rule        ///        rule_type rule() const        {            return rule_;        }        ///        /// Check if two boundary points are the same        ///        bool operator==(boundary_point const &other) const        {            return iterator_ == other.iterator_ && rule_ = other.rule_;        }        ///        /// Check if two boundary points are different        ///        bool operator!=(boundary_point const &other) const        {            return !(*this==other);        }        ///        /// Check if the boundary point points to same location as an iterator \a other        ///        bool operator==(iterator_type const &other) const        {            return iterator_ == other;        }        ///        /// Check if the boundary point points to different location from an iterator \a other        ///        bool operator!=(iterator_type const &other) const        {            return iterator_ != other;        }        ///        /// Automatic cast to the iterator it represents        ///        operator iterator_type ()const        {            return iterator_;        }    private:        iterator_type iterator_;        rule_type rule_;           };    ///    /// Check if the boundary point \a r points to same location as an iterator \a l    ///    template<typename BaseIterator>    bool operator==(BaseIterator const &l,boundary_point<BaseIterator> const &r)    {        return r==l;    }    ///    /// Check if the boundary point \a r points to different location from an iterator \a l    ///    template<typename BaseIterator>    bool operator!=(BaseIterator const &l,boundary_point<BaseIterator> const &r)    {        return r!=l;    }    /// @}        typedef boundary_point<std::string::const_iterator> sboundary_point;      ///< convenience typedef    typedef boundary_point<std::wstring::const_iterator> wsboundary_point;    ///< convenience typedef    #ifdef BOOST_LOCALE_ENABLE_CHAR16_T    typedef boundary_point<std::u16string::const_iterator> u16sboundary_point;///< convenience typedef    #endif    #ifdef BOOST_LOCALE_ENABLE_CHAR32_T    typedef boundary_point<std::u32string::const_iterator> u32sboundary_point;///< convenience typedef    #endif       typedef boundary_point<char const *> cboundary_point;                     ///< convenience typedef    typedef boundary_point<wchar_t const *> wcboundary_point;                 ///< convenience typedef    #ifdef BOOST_LOCALE_ENABLE_CHAR16_T    typedef boundary_point<char16_t const *> u16cboundary_point;              ///< convenience typedef    #endif    #ifdef BOOST_LOCALE_ENABLE_CHAR32_T    typedef boundary_point<char32_t const *> u32cboundary_point;              ///< convenience typedef    #endif    } // boundary} // locale} // boost#endif// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
 |