File: TrackerList.h

package info (click to toggle)
pymol 2.5.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 42,288 kB
  • sloc: cpp: 476,472; python: 76,538; ansic: 29,510; javascript: 6,792; sh: 47; makefile: 24
file content (109 lines) | stat: -rw-r--r-- 2,553 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#pragma once

#include "Tracker.h"

namespace pymol
{

/**
 * Manages a Tracker list provided from outside function
 */

template <typename T> class TrackerAdapter
{
  /**
   * Iterator for pymol::ListAdapter
   * Not really  aiming to satisfy any of the standard
   * named requirements for iterators, but to only implement
   * ones that will likely be used.
   * Uses IsConst pattern to avoid having to define non-const and const iterator
   * versions
   */

  template <bool IsConst> class TrackerAdapterIterator
  {
  public:
    using value_type = typename std::conditional<IsConst, const T, T>::type;
    using pointer = value_type*;
    using reference = value_type&;

    TrackerAdapterIterator()
        : m_ptr(nullptr)
    {
    }

    explicit TrackerAdapterIterator(CTracker* tracker, int list_id)
        : m_tracker(tracker)
        , m_iter_id(TrackerNewIter(tracker, 0, list_id))
    {
      ++*this;
    }

    ~TrackerAdapterIterator()
    {
      // safe to call for m_iter_id == -1
      TrackerDelIter(m_tracker, m_iter_id);
    }

    // move only because it owns m_iter_id
    TrackerAdapterIterator(TrackerAdapterIterator&& other)
        : m_tracker(other.m_tracker)
        , m_ptr(other.m_ptr)
    {
      std::swap(m_iter_id, other.m_iter_id);
    }

    reference operator*() { return *m_ptr; }

    pointer operator->() { return m_ptr; }

    TrackerAdapterIterator& operator++()
    {
      m_ptr = nullptr;
      TrackerIterNextCandInList(
          m_tracker, m_iter_id, (TrackerRef**) (void*) &m_ptr);
      return *this;
    }

    bool operator==(const TrackerAdapterIterator& iter) const
    {
      return m_ptr == iter.m_ptr;
    }

    bool operator!=(const TrackerAdapterIterator& iter) const
    {
      return !(m_ptr == iter.m_ptr);
    }

  private:
    int m_iter_id = -1;
    CTracker* m_tracker;
    pointer m_ptr;
  };

public:
  using type = T;
  using iterator = TrackerAdapterIterator<false>;
  using const_iterator = TrackerAdapterIterator<true>;

  // Takes ownership of tracker id: list_id
  explicit TrackerAdapter(CTracker* tracker, int list_id)
      : m_tracker(tracker)
      , m_list_id(list_id)
  {
  }
  ~TrackerAdapter()
  {
    TrackerDelList(m_tracker, m_list_id);
  }
  iterator begin() { return iterator(m_tracker, m_list_id); }
  const_iterator begin() const { return const_iterator(m_tracker, m_list_id); }
  iterator end() { return iterator(); }
  const_iterator end() const { return const_iterator(); }

private:
  CTracker* m_tracker;
  int m_list_id;
};

} // namespace pymol