Skip to content

Commit 7fe2cf3

Browse files
authored
Merge pull request #118 from stdgraph/edge_id
Remove edge_id(g,uv) and edge_id_t<G>
2 parents 2e77c19 + abe35e3 commit 7fe2cf3

File tree

3 files changed

+5
-108
lines changed

3 files changed

+5
-108
lines changed

include/graph/detail/graph_cpo.hpp

-95
Original file line numberDiff line numberDiff line change
@@ -1333,101 +1333,6 @@ inline namespace _Cpos {
13331333
}
13341334

13351335

1336-
//
1337-
// edge_id(g,uv) -> edge_id_t<G>
1338-
// default = edge_id_t<G>(source_id(g,uv),target_id(g,uv))
1339-
//
1340-
// edge_id_t<G> = edge_descriptor<vertex_id_t<_G>, true, void, void>
1341-
//
1342-
template <class _G>
1343-
using edge_id_t = edge_descriptor<vertex_id_t<_G>, true, void, void>; // {source_id, target_id}
1344-
1345-
namespace _Edge_id {
1346-
# if defined(__clang__) || defined(__EDG__) // TRANSITION, VSO-1681199
1347-
void edge_id() = delete; // Block unqualified name lookup
1348-
# else // ^^^ no workaround / workaround vvv
1349-
void edge_id();
1350-
# endif // ^^^ workaround ^^^
1351-
1352-
template <class _G>
1353-
concept _Has_ref_member = requires(_G&& __g, edge_reference_t<_G> uv) {
1354-
{ uv.edge_id(__g) } -> convertible_to<edge_id_t<_G>>;
1355-
};
1356-
template <class _G>
1357-
concept _Has_ref_ADL = _Has_class_or_enum_type<_G> //
1358-
&& requires(_G&& __g, const edge_reference_t<_G>& uv) {
1359-
{ _Fake_copy_init(edge_id(__g, uv)) } -> convertible_to<edge_id_t<_G>>; // intentional ADL
1360-
};
1361-
1362-
template <class _G>
1363-
concept _Can_id_eval = _Has_class_or_enum_type<_G> //
1364-
&& requires(_G&& __g, edge_reference_t<_G> uv) {
1365-
{ _Fake_copy_init(edge_id_t<_G>{source_id(__g, uv), target_id(__g, uv)}) };
1366-
};
1367-
class _Cpo {
1368-
private:
1369-
enum class _St_ref { _None, _Member, _Non_member, _Auto_eval };
1370-
1371-
template <class _G>
1372-
[[nodiscard]] static consteval _Choice_t<_St_ref> _Choose_ref() noexcept {
1373-
static_assert(is_lvalue_reference_v<_G>);
1374-
if constexpr (_Has_ref_member<_G>) {
1375-
return {_St_ref::_Member, noexcept(_Fake_copy_init(declval<edge_reference_t<_G>>().edge_id(declval<_G>())))};
1376-
} else if constexpr (_Has_ref_ADL<_G>) {
1377-
return {_St_ref::_Non_member,
1378-
noexcept(_Fake_copy_init(edge_id(declval<_G>(), declval<edge_reference_t<_G>>())))}; // intentional ADL
1379-
} else if constexpr (_Can_id_eval<_G>) {
1380-
return {_St_ref::_Auto_eval,
1381-
noexcept(_Fake_copy_init(edge_id_t<_G>{source_id(declval<_G>(), declval<edge_reference_t<_G>>()),
1382-
target_id(declval<_G>(), declval<edge_reference_t<_G>>())}))};
1383-
} else {
1384-
return {_St_ref::_None};
1385-
}
1386-
}
1387-
1388-
template <class _G>
1389-
static constexpr _Choice_t<_St_ref> _Choice_ref = _Choose_ref<_G>();
1390-
1391-
public:
1392-
/**
1393-
* @brief The id of an edge, made from its source_id and target_id.
1394-
*
1395-
* Complexity: O(1)
1396-
*
1397-
* Default implementation:
1398-
* edge_descriptor<vertex_id_t<G>,true>{source_id(g,uv), target_id(g,uv)}
1399-
* given that source_id(g,uv) is defined.
1400-
*
1401-
* @tparam G The graph type.
1402-
* @param g A graph instance.
1403-
* @param uv An edge reference.
1404-
* @return An edge_descriptor with the source_id and target_id.
1405-
*/
1406-
template <class _G>
1407-
requires(_Choice_ref<_G&>._Strategy != _St_ref::_None)
1408-
[[nodiscard]] constexpr auto operator()(_G&& __g, edge_reference_t<_G> uv) const
1409-
noexcept(_Choice_ref<_G&>._No_throw) {
1410-
constexpr _St_ref _Strat_ref = _Choice_ref<_G&>._Strategy;
1411-
1412-
if constexpr (_Strat_ref == _St_ref::_Member) {
1413-
return uv.edge_id(__g);
1414-
} else if constexpr (_Strat_ref == _St_ref::_Non_member) {
1415-
return edge_id(__g, uv); // intentional ADL
1416-
} else if constexpr (_Strat_ref == _St_ref::_Auto_eval) {
1417-
return edge_id_t<_G>{source_id(__g, uv), target_id(__g, uv)};
1418-
} else {
1419-
static_assert(_Always_false<_G>,
1420-
"edge_id(g,uv) is not defined, or target_id(g,uv) and source_id(g,uv) are not defined");
1421-
}
1422-
}
1423-
};
1424-
} // namespace _Edge_id
1425-
1426-
inline namespace _Cpos {
1427-
inline constexpr _Edge_id::_Cpo edge_id;
1428-
}
1429-
1430-
14311336
//
14321337
// find_vertex_edge(g,u,vid) -> vertex_edge_iterator<G>
14331338
// default = find(edges(g,u), [](uv) {target_id(g,uv)==vid;}

include/graph/edgelist.hpp

-4
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
// source_id(e)
4444
// target_id(e)
4545
// edge_value(e)
46-
// edge_id(e) (todo)
4746
//
4847
// Edge definitions supported without overrides
4948
// -----------------------------------------------------------------------------
@@ -132,9 +131,6 @@ namespace edgelist {
132131
template <basic_sourced_edgelist EL> // For exposition only
133132
using edge_value_t = decltype(edge_value(declval<edge_t<edge_range_t<EL>>>()));
134133

135-
template <basic_sourced_edgelist EL> // For exposition only
136-
using edge_id_t = decltype(edge_id(declval<edge_t<edge_range_t<EL>>>()));
137-
138134
template <basic_sourced_edgelist EL> // For exposition only
139135
using vertex_id_t = decltype(source_id(declval<edge_t<edge_range_t<EL>>>()));
140136

include/graph/graph.hpp

+5-9
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,8 @@ concept basic_targeted_edge = requires(G&& g, edge_reference_t<G> uv) { target_i
7979
template <class G> // For exposition only
8080
concept basic_sourced_edge = requires(G&& g, edge_reference_t<G> uv) { source_id(g, uv); };
8181

82-
template <class G> // For exposition only
83-
concept basic_sourced_targeted_edge = basic_targeted_edge<G> && //
84-
basic_sourced_edge<G> && //
85-
requires(G&& g, edge_reference_t<G> uv) { edge_id(g, uv); };
82+
template <class G> // For exposition only
83+
concept basic_sourced_targeted_edge = basic_targeted_edge<G> && basic_sourced_edge<G>;
8684

8785

8886
/**
@@ -102,10 +100,8 @@ template <class G> // For exposition only
102100
concept sourced_edge = basic_sourced_edge<G> && //
103101
requires(G&& g, edge_reference_t<G> uv) { source(g, uv); };
104102

105-
template <class G> // For exposition only
106-
concept sourced_targeted_edge = targeted_edge<G> && //
107-
sourced_edge<G> && //
108-
requires(G&& g, edge_reference_t<G> uv) { edge_id(g, uv); };
103+
template <class G> // For exposition only
104+
concept sourced_targeted_edge = targeted_edge<G> && sourced_edge<G>;
109105

110106

111107
/**
@@ -380,7 +376,7 @@ concept has_contains_edge = requires(G&& g, vertex_id_t<G> uid, vertex_id_t<G> v
380376
template <class G>
381377
struct define_unordered_edge : public false_type {}; // specialized for graph container edge
382378

383-
template <class G> // For exposition only
379+
template <class G> // For exposition only
384380
concept unordered_edge = basic_sourced_edge<G> && define_unordered_edge<G>::value;
385381

386382
//

0 commit comments

Comments
 (0)