Ignore:
Timestamp:
Nov 19, 2015, 4:47:28 PM (4 years ago)
Author:
nmedfort
Message:

More work towards n-ary And/Or/Xor? functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/pabloAST.h

    r4873 r4876  
    1414#include <iterator>
    1515#include <unordered_map>
     16#include <boost/iterator/iterator_facade.hpp>
    1617
    1718using namespace llvm;
     
    2526class PabloAST {
    2627    friend class Statement;
     28    friend class Variadic;
    2729    friend class StatementList;
    2830    friend class Var;
     
    3739    using Allocator = SlabAllocator<u_int8_t>;
    3840    using VectorAllocator = Allocator::rebind<PabloAST *>::other;
    39     using Vector = std::vector<PabloAST*, VectorAllocator>;
    40     using user_iterator = Vector::iterator;
    41     using const_user_iterator = Vector::const_iterator;
     41    using Users = std::vector<PabloAST *, VectorAllocator>;
     42    using user_iterator = Users::iterator;
     43    using const_user_iterator = Users::const_iterator;
    4244
    4345    enum class ClassTypeId : unsigned {
     
    99101    }
    100102
    101     inline Vector & users() {
     103    inline Users & users() {
    102104        return mUsers;
    103105    }
    104106
    105     inline const Vector & users() const {
     107    inline const Users & users() const {
    106108        return mUsers;
    107109    }
     
    109111    void replaceAllUsesWith(PabloAST * expr);
    110112
    111     inline Vector::size_type getNumUses() const {
     113    inline Users::size_type getNumUses() const {
    112114        return mUsers.size();
    113115    }
     
    128130
    129131    }
    130     inline void addUser(PabloAST * user) {
    131         assert (user);
    132         auto pos = std::lower_bound(mUsers.begin(), mUsers.end(), user);
    133         if (LLVM_UNLIKELY(pos != mUsers.end() && *pos == user)) {
    134             return;
    135         }
    136         mUsers.insert(pos, user);
    137     }
    138     inline void removeUser(PabloAST * user) {
    139         assert (user);
    140         if (mUsers.empty()) {
    141             return;
    142         }
    143         auto pos = std::lower_bound(mUsers.begin(), mUsers.end(), user);
    144         if (LLVM_UNLIKELY(pos == mUsers.end() || *pos != user)) {
    145             return;
    146         }
    147         mUsers.erase(pos);
    148     }
     132    void addUser(PabloAST * user);
     133    void removeUser(PabloAST * user);
    149134    virtual ~PabloAST() {
    150135        mUsers.clear();
     
    153138private:
    154139    const ClassTypeId       mClassTypeId;
    155     Vector                  mUsers;
     140    Users                   mUsers;
    156141};
    157142
     
    259244class Variadic : public Statement {
    260245public:
    261     void addOperand(PabloAST * expr);
    262     void removeOperand(const unsigned index);
     246
     247    static inline bool classof(const PabloAST * e) {
     248        switch (e->getClassTypeId()) {
     249            case PabloAST::ClassTypeId::And:
     250            case PabloAST::ClassTypeId::Or:
     251            case PabloAST::ClassTypeId::Xor:
     252                return true;
     253            default: return false;
     254        }
     255    }
     256    static inline bool classof(const Variadic *) {
     257        return true;
     258    }
     259    static inline bool classof(const void *) {
     260        return false;
     261    }
     262
     263    class iterator : public boost::iterator_facade<iterator, PabloAST *, boost::random_access_traversal_tag> {
     264        friend class Variadic;
     265        friend class boost::iterator_core_access;
     266    protected:
     267
     268        iterator(PabloAST ** pointer) : mCurrent(pointer) { }
     269        inline void increment() { ++mCurrent; }
     270        inline void decrement() { --mCurrent; }
     271        inline void advance(const unsigned n) { mCurrent += n; }
     272        inline std::ptrdiff_t distance_to(const iterator & other) const { return other.mCurrent - mCurrent; }
     273        inline PabloAST *& dereference() const { return *mCurrent; }
     274
     275        inline bool equal(const iterator & other) const { return (mCurrent == other.mCurrent); }
     276
     277    private:
     278        PabloAST **        mCurrent;
     279    };
     280
     281    using const_iterator = iterator;
     282
     283    void addOperand(PabloAST * const expr);
     284
     285    PabloAST * removeOperand(const unsigned index);
     286
     287    inline iterator erase(iterator itr) {
     288        removeOperand(itr.distance_to(begin()));
     289        return itr;
     290    }
     291
     292    iterator begin() {
     293        return iterator(mOperand);
     294    }
     295
     296    const_iterator begin() const {
     297        return iterator(mOperand);
     298    }
     299
     300    iterator end() {
     301        return iterator(mOperand + mOperands);
     302    }
     303
     304    const_iterator end() const {
     305        return iterator(mOperand + mOperands);
     306    }
     307
    263308protected:
    264309    Variadic(const ClassTypeId id, std::initializer_list<PabloAST *> operands, const String * const name)
     
    430475    : mInsertionPoint(nullptr)
    431476    , mFirst(nullptr)
    432     , mLast(nullptr)
    433     {
     477    , mLast(nullptr) {
    434478
    435479    }
    436480
    437481    StatementList(StatementList && other)
    438     : mFirst(other.mFirst)
    439     , mLast(other.mLast)
    440     {
     482    : mInsertionPoint(nullptr)
     483    , mFirst(other.mFirst)
     484    , mLast(other.mLast) {
     485        other.mInsertionPoint = nullptr;
    441486        other.mFirst = nullptr;
    442487        other.mLast = nullptr;
     
    508553    }
    509554
    510     ~StatementList();
    511 
    512555    bool contains(Statement * const statement);
     556
     557protected:
     558
     559    ~StatementList() = default;
    513560
    514561private:
     
    519566};
    520567
     568/** ------------------------------------------------------------------------------------------------------------- *
     569 * @brief addUser
     570 ** ------------------------------------------------------------------------------------------------------------- */
     571inline void PabloAST::addUser(PabloAST *user) {
     572    assert (user);
     573    // Note: for the rare situation that this node is used multiple times by a statement, duplicates are allowed.
     574    mUsers.insert(std::lower_bound(mUsers.begin(), mUsers.end(), user), user);
    521575}
    522576
     577/** ------------------------------------------------------------------------------------------------------------- *
     578 * @brief removeUser
     579 ** ------------------------------------------------------------------------------------------------------------- */
     580inline void PabloAST::removeUser(PabloAST * user) {
     581    assert (user);
     582    auto pos = std::lower_bound(mUsers.begin(), mUsers.end(), user);
     583    assert ("Could not find user to remove!" && (pos != mUsers.end() && *pos == user));
     584    mUsers.erase(pos);
     585}
     586
     587}
     588
    523589#endif // PE_PabloAST_H
    524 
    525 
    526 
Note: See TracChangeset for help on using the changeset viewer.