+#ifndef DOXYGEN
+ static xbt::signal<void(NetZone const&)> on_creation;
+ static xbt::signal<void(NetZone const&)> on_seal;
+#endif
+
+public:
+ /** \static Add a callback fired on each newly created NetZone */
+ static void on_creation_cb(const std::function<void(NetZone const&)>& cb) { on_creation.connect(cb); }
+ /** \static Add a callback fired on each newly sealed NetZone */
+ static void on_seal_cb(const std::function<void(NetZone const&)>& cb) { on_seal.connect(cb); }
+
+ /**
+ * @brief Create a host
+ *
+ * @param name Host name
+ * @param speed_per_pstate Vector of CPU's speeds
+ */
+ s4u::Host* create_host(const std::string& name, const std::vector<double>& speed_per_pstate);
+ s4u::Host* create_host(const std::string& name, double speed);
+ /**
+ * @brief Create a Host (string version)
+ *
+ * @throw std::invalid_argument if speed format is incorrect.
+ */
+ s4u::Host* create_host(const std::string& name, const std::vector<std::string>& speed_per_pstate);
+ s4u::Host* create_host(const std::string& name, const std::string& speed);
+
+ /**
+ * @brief Create a link
+ *
+ * @param name Link name
+ * @param bandwidths Link's speed (vector for wifi links)
+ * @throw std::invalid_argument if bandwidth format is incorrect.
+ */
+ s4u::Link* create_link(const std::string& name, const std::vector<double>& bandwidths);
+ s4u::Link* create_link(const std::string& name, double bandwidth);
+
+ /** @brief Create a link (string version) */
+ s4u::Link* create_link(const std::string& name, const std::vector<std::string>& bandwidths);
+ s4u::Link* create_link(const std::string& name, const std::string& bandwidth);
+
+ /**
+ * @brief Create a split-duplex link
+ *
+ * In SimGrid, split-duplex links are a composition of 2 regular (shared) links (up/down).
+ *
+ * This function eases its utilization by creating the 2 links for you. We append a suffix
+ * "_UP" and "_DOWN" to your link name to identify each of them.
+ *
+ * Both up/down links have exactly the same bandwidth
+ *
+ * @param name Name of the link
+ * @param bandwidth Speed
+ */
+ s4u::SplitDuplexLink* create_split_duplex_link(const std::string& name, const std::string& bandwidth);
+ s4u::SplitDuplexLink* create_split_duplex_link(const std::string& name, double bandwidth);
+
+ kernel::resource::NetworkModel* get_network_model() const;
+
+ /**
+ * @brief Make a router within that NetZone
+ *
+ * @param name Router name
+ */
+ kernel::routing::NetPoint* create_router(const std::string& name);
+
+ /** @brief Seal this netzone configuration */
+ NetZone* seal();
+
+ void
+ set_latency_factor_cb(std::function<double(double size, const s4u::Host* src, const s4u::Host* dst,
+ const std::vector<s4u::Link*>& /*links*/,
+ const std::unordered_set<s4u::NetZone*>& /*netzones*/)> const& cb) const;
+ void
+ set_bandwidth_factor_cb(std::function<double(double size, const s4u::Host* src, const s4u::Host* dst,
+ const std::vector<s4u::Link*>& /*links*/,
+ const std::unordered_set<s4u::NetZone*>& /*netzones*/)> const& cb) const;
+};
+
+// External constructors so that the types (and the types of their content) remain hidden
+XBT_PUBLIC NetZone* create_full_zone(const std::string& name);
+XBT_PUBLIC NetZone* create_star_zone(const std::string& name);
+XBT_PUBLIC NetZone* create_dijkstra_zone(const std::string& name, bool cache);
+XBT_PUBLIC NetZone* create_empty_zone(const std::string& name);
+XBT_PUBLIC NetZone* create_floyd_zone(const std::string& name);
+XBT_PUBLIC NetZone* create_vivaldi_zone(const std::string& name);
+XBT_PUBLIC NetZone* create_wifi_zone(const std::string& name);
+
+// Extra data structure for complex constructors
+
+/** @brief Aggregates the callbacks used to build clusters netzones (Torus/Dragronfly/Fat-Tree) */
+struct ClusterCallbacks {
+ /**
+ * @brief Callback used to set the netpoint and gateway located at some leaf of clusters (Torus, FatTree, etc)
+ *
+ * The netpoint can be either a host, router or another netzone.
+ * Gateway must be non-null if netpoint is a netzone
+ *
+ * @param zone: The newly create zone, needed for creating new resources (hosts, links)
+ * @param coord: the coordinates of the element
+ * @param id: Internal identifier of the element
+ * @return pair<NetPoint*, NetPoint*>: returns a pair of netpoint and gateway.
+ */
+ // XBT_ATTRIB_DEPRECATED_v339
+ using ClusterNetPointCb = std::pair<kernel::routing::NetPoint*, kernel::routing::NetPoint*>(
+ NetZone* zone, const std::vector<unsigned long>& coord, unsigned long id);
+
+ /**
+ * @brief Callback used to set the NetZone located at some leaf of clusters (Torus, FatTree, etc)
+ *
+ * @param zone: The parent zone, needed for creating new resources (hosts, links)
+ * @param coord: the coordinates of the element
+ * @param id: Internal identifier of the element
+ * @return NetZone*: returns newly created netzone
+ */
+ using ClusterNetZoneCb = NetZone*(NetZone* zone, const std::vector<unsigned long>& coord, unsigned long id);
+ /**
+ * @brief Callback used to set the Host located at some leaf of clusters (Torus, FatTree, etc)
+ *
+ * @param zone: The parent zone, needed for creating new resources (hosts, links)
+ * @param coord: the coordinates of the element
+ * @param id: Internal identifier of the element
+ * @return Host*: returns newly created host
+ */
+ using ClusterHostCb = Host*(NetZone* zone, const std::vector<unsigned long>& coord, unsigned long id);