PriorityPointerPair.h revision 598df88bd6fc33c6fb330bc859bdc277795501f3
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- PriorityPointerPair.h ----------------------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef liblldb_PriorityPointerPair_h_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define liblldb_PriorityPointerPair_h_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "lldb/lldb-public.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "lldb/Utility/SharingPtr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace lldb_utility {
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch//----------------------------------------------------------------------
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A prioritized pair of SharedPtr<T>. One of the two pointers is high
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// priority, the other is low priority.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The Get() method always returns high, if *high != NULL,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// otherwise, low is returned (even if *low == NULL)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//----------------------------------------------------------------------
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T>
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PriorityPointerPair
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef T& reference_type;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef T* pointer_type;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    typedef typename STD_SHARED_PTR(T) T_SP;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PriorityPointerPair() :
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    m_high(),
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    m_low()
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PriorityPointerPair(pointer_type high,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        pointer_type low) :
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_high(high),
43b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    m_low(low)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PriorityPointerPair(pointer_type low) :
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    m_high(),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_low(low)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PriorityPointerPair(T_SP& high,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        T_SP& low) :
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_high(high),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_low(low)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PriorityPointerPair(T_SP& low) :
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_high(),
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    m_low(low)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SwapLow(pointer_type l)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_low.swap(l);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SwapHigh(pointer_type h)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_high.swap(h);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SwapLow(T_SP l)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_low.swap(l);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SwapHigh(T_SP h)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_high.swap(h);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_SP
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetLow()
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_low;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_SP
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GetHigh()
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_high;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_SP
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Get()
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (m_high.get())
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return m_high;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return m_low;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetHigh()
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_high.reset();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ResetLow()
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        m_low.reset();
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Reset()
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ResetLow();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ResetHigh();
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    reference_type
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    operator*() const
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return Get().operator*();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pointer_type
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    operator->() const
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return Get().operator->();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ~PriorityPointerPair();
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)private:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_SP m_high;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    T_SP m_low;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN (PriorityPointerPair);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace lldb_utility
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // #ifndef liblldb_PriorityPointerPair_h_
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)