Program Listing for File node.h#

↰ Return to documentation for file (include/nodes-graph/node.h)

#pragma once


#include <cstdint>
#include <random>
#include <set>
#include <string>
#include "nodes-graph/types.h"


namespace ng {

    class Node {
        std::string name_;
        node_id_t id_;                       // instance id
        qualifier_t qualifier_;              // node type qualifier (or graph qualifier for proxies)
        std::set<socket_id_t> input_sockets_;
        std::set<socket_id_t> output_sockets_;
        bool proxy_ = false;

        static std::mt19937 generator_;
        static std::uniform_int_distribution<std::size_t> distribution_;

    public:
        Node(
            const std::string& name="",
            const node_id_t& id=null_node,
            const qualifier_t& qualifier=null_qualifier,
            const std::set<socket_id_t>& input_sockets={},
            const std::set<socket_id_t>& output_sockets={},
            bool proxy=false
        );

        // --- Setters
        inline void set_name(const std::string& name) { name_ = name; }
        inline void set_proxy(bool proxy) { proxy_ = proxy; }

        // --- Getters
        inline const std::string& get_name() const { return name_; }
        inline const node_id_t& get_id() const { return id_; }
        inline const qualifier_t& get_qualifier() const { return qualifier_; }
        inline const std::set<socket_id_t>& get_input_sockets() const { return input_sockets_; }
        inline const std::set<socket_id_t>& get_output_sockets() const { return output_sockets_; }
        inline bool is_proxy() const { return proxy_; }

        // --- Methods
        inline std::size_t n_input_sockets() const { return input_sockets_.size(); }
        inline std::size_t n_output_sockets() const { return output_sockets_.size(); }
        inline bool has_input_socket(const socket_id_t& socket_id) const { return input_sockets_.count(socket_id) > 0; }
        inline bool has_output_socket(const socket_id_t& socket_id) const { return output_sockets_.count(socket_id) > 0; }

        bool register_input_socket(const socket_id_t& socket_id);
        bool register_output_socket(const socket_id_t& socket_id);

        bool remove_input_socket(const socket_id_t& socket_id);
        bool remove_output_socket(const socket_id_t& socket_id);

        // --- Random IDs

        static std::size_t make_random_id();

        static void seed_random_ids(uint32_t seed);
    };

} // namespace ng