76 lines
3.9 KiB
C++
76 lines
3.9 KiB
C++
#include <utility>
|
|
|
|
#pragma once
|
|
|
|
#include "misc/advanced_mutex.h"
|
|
#include <Definitions.h>
|
|
#include <deque>
|
|
#include <ThreadPool/Mutex.h>
|
|
#include "misc/memtracker.h"
|
|
|
|
#ifndef __attribute_deprecated__
|
|
#define __attribute_deprecated__ [[deprecated]]
|
|
#endif
|
|
|
|
namespace ts {
|
|
class TreeEntry;
|
|
class TreeView {
|
|
public:
|
|
struct LinkedTreeEntry {
|
|
std::shared_ptr<LinkedTreeEntry> previous;
|
|
std::shared_ptr<LinkedTreeEntry> next;
|
|
std::shared_ptr<LinkedTreeEntry> child_head;
|
|
std::weak_ptr<LinkedTreeEntry> parent;
|
|
|
|
const std::shared_ptr<TreeEntry> entry;
|
|
|
|
explicit LinkedTreeEntry(std::shared_ptr<TreeEntry> entry) : entry(std::move(entry)) {
|
|
memtrack::allocated<LinkedTreeEntry>(this);
|
|
}
|
|
|
|
virtual ~LinkedTreeEntry() {
|
|
memtrack::freed<LinkedTreeEntry>(this);
|
|
}
|
|
};
|
|
|
|
public:
|
|
TreeView();
|
|
virtual ~TreeView();
|
|
|
|
size_t entry_count() const;
|
|
std::deque<std::shared_ptr<TreeEntry>> entries(const std::shared_ptr<TreeEntry>& /* head */ = nullptr, int /* deep */ = -1) const;
|
|
std::deque<std::shared_ptr<TreeEntry>> entries_sub(const std::shared_ptr<TreeEntry>& /* parent */ = nullptr, int /* deep */ = -1) const;
|
|
std::shared_ptr<TreeEntry> find_entry(ChannelId /* channel id */) const;
|
|
std::shared_ptr<LinkedTreeEntry> find_linked_entry(ChannelId /* channel id */, const std::shared_ptr<LinkedTreeEntry>& /* head */ = nullptr, int deep = -1) const;
|
|
|
|
bool has_entry(const std::shared_ptr<TreeEntry>& /* entry */, const std::shared_ptr<TreeEntry>& /* head */ = nullptr, int deep = -1) const;
|
|
|
|
bool insert_entry(const std::shared_ptr<TreeEntry>& entry, const std::shared_ptr<TreeEntry>& /* parent */ = nullptr, const std::shared_ptr<TreeEntry>& /* previous */ = nullptr);
|
|
bool move_entry(const std::shared_ptr<TreeEntry>& /* entry */, const std::shared_ptr<TreeEntry>& /* parent */ = nullptr, const std::shared_ptr<TreeEntry>& /* previous */ = nullptr);
|
|
std::deque<std::shared_ptr<TreeEntry>> delete_entry(std::shared_ptr<TreeEntry> /* entry */); //Copy that here because of reference could be changed (linked->entry)
|
|
|
|
void print_tree(const std::function<void(const std::shared_ptr<TreeEntry>& /* entry */, int /* deep */)>&) const;
|
|
protected:
|
|
std::shared_ptr<LinkedTreeEntry> head;
|
|
private:
|
|
inline std::shared_ptr<LinkedTreeEntry> linked(const std::shared_ptr<TreeEntry>& /* entry */) const;
|
|
inline std::deque<std::shared_ptr<LinkedTreeEntry>> query_deep(const std::shared_ptr<LinkedTreeEntry>& /* layer */ = nullptr,int /* max deep */ = -1) const;
|
|
inline void query_deep_(std::deque<std::shared_ptr<LinkedTreeEntry>>& /* result */, const std::shared_ptr<LinkedTreeEntry>& /* layer */ = nullptr,int /* max deep */ = -1) const;
|
|
inline std::deque<std::shared_ptr<TreeEntry>> query_deep_entry(const std::shared_ptr<LinkedTreeEntry>& /* layer */ = nullptr,int /* max deep */ = -1) const;
|
|
inline bool has_entry_(const std::shared_ptr<TreeEntry>& /* entry */, const std::shared_ptr<LinkedTreeEntry>& /* head */ = nullptr, int deep = -1) const;
|
|
void print_tree_(const std::function<void(const std::shared_ptr<TreeEntry>& /* entry */, int /* deep */)>&, std::shared_ptr<LinkedTreeEntry> /* head */, int /* deep */) const;
|
|
|
|
inline void cut_entry(const std::shared_ptr<LinkedTreeEntry>&);
|
|
};
|
|
|
|
class TreeEntry {
|
|
public:
|
|
virtual ChannelId channelId() const = 0;
|
|
|
|
virtual ChannelId previousChannelId() const = 0;
|
|
virtual void setPreviousChannelId(ChannelId) = 0;
|
|
virtual void setParentChannelId(ChannelId) = 0;
|
|
|
|
virtual void setLinkedHandle(const std::weak_ptr<TreeView::LinkedTreeEntry>& /* self */) {}
|
|
};
|
|
} |