Ignore:
Timestamp:
Nov 5, 2015, 4:41:37 PM (4 years ago)
Author:
nmedfort
Message:

Back up check in. Memory leaks should be fixed.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/UCD/unicode_set.h

    r4818 r4860  
    44#include <vector>
    55#include <boost/iterator/iterator_facade.hpp>
     6#include <slab_allocator.h>
    67
    78//
     
    4849    using interval_t = std::pair<codepoint_t, codepoint_t>;
    4950
    50     using RunVector = std::vector<run_t>;
    51     using QuadVector = std::vector<bitquad_t>;
     51    using Allocator = SlabAllocator<uint32_t>;
     52    using RunAllocator = Allocator::rebind<run_t>::other;
     53    using QuadAllocator = Allocator::rebind<bitquad_t>::other;
     54
     55    using RunVector = std::vector<run_t, RunAllocator>;
     56    using QuadVector = std::vector<bitquad_t, QuadAllocator>;
     57    using RunIterator = RunVector::const_iterator;
     58    using QuadIterator = QuadVector::const_iterator;
    5259
    5360    using size_type = RunVector::size_type;
     
    7885        }
    7986    private:
    80         RunVector::const_iterator           mRunIterator;
    81         QuadVector::const_iterator          mQuadIterator;
    82         unsigned                            mMixedRunIndex;
    83         bitquad_t                           mQuadOffset;
    84         codepoint_t                         mBaseCodePoint;
    85         codepoint_t                         mMinCodePoint;
    86         codepoint_t                         mMaxCodePoint;
     87        RunIterator         mRunIterator;
     88        QuadIterator        mQuadIterator;
     89        unsigned            mMixedRunIndex;
     90        bitquad_t           mQuadOffset;
     91        codepoint_t         mBaseCodePoint;
     92        codepoint_t         mMinCodePoint;
     93        codepoint_t         mMaxCodePoint;
    8794    };
    8895
     
    96103    }
    97104
    98     class quad_iterator : public boost::iterator_facade<quad_iterator, quad_iterator_return_t, boost::random_access_traversal_tag, quad_iterator_return_t> {
    99         friend class UnicodeSet;
    100         friend class boost::iterator_core_access;
    101     public:
    102         quad_iterator(RunVector::const_iterator runIterator, QuadVector::const_iterator quadIterator)
    103             : mRunIterator(runIterator), mQuadIterator(quadIterator), mOffset(0) {}
    104 
    105         void advance(unsigned n);
    106 
    107         inline quad_iterator_return_t dereference() const {
    108             return std::make_pair(std::make_pair(type(), length()), quad());
    109         }
    110 
    111         inline void increment() {
    112             advance(1);
    113         }
    114 
    115         inline run_type_t type() const {
    116             return mRunIterator->first;
    117         }
    118 
    119         inline length_t length() const {
    120             return mRunIterator->second - mOffset;
    121         }
    122 
    123         inline bitquad_t quad() const {
    124             return *mQuadIterator;
    125         }
    126 
    127         inline bool equal(const quad_iterator & other) const {
    128             return (mRunIterator == other.mRunIterator) && (mQuadIterator == other.mQuadIterator);
    129         }
    130 
    131     private:
    132         RunVector::const_iterator   mRunIterator;
    133         QuadVector::const_iterator  mQuadIterator;
    134         unsigned                    mOffset;
    135     };
    136 
    137     inline quad_iterator quad_begin() const {
    138         return quad_iterator(mRuns.cbegin(), mQuads.cbegin());
    139     }
    140 
    141     inline quad_iterator quad_end() const {
    142         return quad_iterator(mRuns.cend(), mQuads.cend());
    143     }
    144 
    145105    bool contains(const codepoint_t codepoint) const;
    146106
    147107    bool intersects(const codepoint_t lo, const codepoint_t hi) const;
    148108
    149     inline void insert(const codepoint_t cp) {
    150         *this = std::move(*this + UnicodeSet(cp));
    151     }
    152 
    153     inline void insert_range(const codepoint_t lo, const codepoint_t hi) {
    154         *this = std::move(*this + UnicodeSet(lo, hi));
    155     }
     109    void insert(const codepoint_t cp);
     110
     111    void insert_range(const codepoint_t lo, const codepoint_t hi);
    156112
    157113    bool empty() const;
     
    178134    UnicodeSet();
    179135    UnicodeSet(const codepoint_t codepoint);
    180     UnicodeSet(const codepoint_t lo_codepoint, const codepoint_t hi_codepoint);
    181     inline UnicodeSet(const UnicodeSet & other) = default;
    182     UnicodeSet(std::initializer_list<run_t> r, std::initializer_list<bitquad_t> q) : mRuns(r), mQuads(q) {}
    183     UnicodeSet(std::vector<run_t> && r, std::vector<bitquad_t> && q) : mRuns(r), mQuads(q) {}
     136    UnicodeSet(const codepoint_t lo, const codepoint_t hi);
     137    UnicodeSet(const UnicodeSet & other);
     138    UnicodeSet(std::initializer_list<run_t> r, std::initializer_list<bitquad_t> q);
     139    UnicodeSet(std::initializer_list<interval_t>::iterator begin, std::initializer_list<interval_t>::iterator end);
     140    UnicodeSet(const std::vector<interval_t>::iterator begin, const std::vector<interval_t>::iterator end);
    184141
    185142    inline void swap(UnicodeSet & other);
    186143    inline void swap(UnicodeSet && other);
    187144
     145protected:
     146
     147    UnicodeSet(std::vector<run_t> && r, std::vector<bitquad_t> && q);
     148
     149    class quad_iterator : public boost::iterator_facade<quad_iterator, quad_iterator_return_t, boost::random_access_traversal_tag, quad_iterator_return_t> {
     150        friend class UnicodeSet;
     151        friend class boost::iterator_core_access;
     152    public:
     153        quad_iterator(RunIterator runIterator, QuadIterator quadIterator)
     154            : mRunIterator(runIterator), mQuadIterator(quadIterator), mOffset(0) {}
     155
     156        void advance(unsigned n);
     157
     158        inline quad_iterator_return_t dereference() const {
     159            return std::make_pair(std::make_pair(type(), length()), quad());
     160        }
     161
     162        inline void increment() {
     163            advance(1);
     164        }
     165
     166        inline run_type_t type() const {
     167            return mRunIterator->first;
     168        }
     169
     170        inline length_t length() const {
     171            return mRunIterator->second - mOffset;
     172        }
     173
     174        inline bitquad_t quad() const {
     175            return *mQuadIterator;
     176        }
     177
     178        inline bool equal(const quad_iterator & other) const {
     179            return (mRunIterator == other.mRunIterator) && (mQuadIterator == other.mQuadIterator);
     180        }
     181
     182    private:
     183        RunIterator     mRunIterator;
     184        QuadIterator    mQuadIterator;
     185        unsigned        mOffset;
     186    };
     187
     188    inline quad_iterator quad_begin() const {
     189        return quad_iterator(mRuns.cbegin(), mQuads.cbegin());
     190    }
     191
     192    inline quad_iterator quad_end() const {
     193        return quad_iterator(mRuns.cend(), mQuads.cend());
     194    }
     195
    188196private:
    189197
    190     RunVector       mRuns;
    191     QuadVector      mQuads;
     198    RunVector           mRuns;
     199    QuadVector          mQuads;
     200    static Allocator    mAllocator;
    192201};
    193202
Note: See TracChangeset for help on using the changeset viewer.