8#ifndef INCLUDED_BDLB_TOPOLOGICALSORTUTIL
9#define INCLUDED_BDLB_TOPOLOGICALSORTUTIL
477#include <bdlscm_version.h>
488#include <bsl_iterator.h>
489#include <bsl_queue.h>
490#include <bsl_unordered_map.h>
491#include <bsl_utility.h>
492#include <bsl_vector.h>
533template <
class EDGE_TYPE>
539template <
class NODE_TYPE>
554 static const NODE_TYPE& from(
const EdgeType& edge);
558 static const NODE_TYPE& to(
const EdgeType& edge);
575template <
class INPUT_ITER>
580 typedef bsl::iterator_traits<INPUT_ITER> InIterTraits;
581 typedef typename InIterTraits::value_type EdgeType;
586 typedef typename EdgeTraits::NodeType NodeType;
607 int d_predecessorCount;
669 INPUT_ITER relationsEnd,
680 template <
class OUTPUT_ITER>
690 template <
class OUTPUT_ITER,
class UNSORTED_OUT_ITER>
691 bool sortImpl(OUTPUT_ITER resultOutIter,
692 UNSORTED_OUT_ITER unsortedOutIter);
748 template <
class INPUT_ITER,
750 class UNSORTED_OUTPUT_ITER>
751 static bool sort(INPUT_ITER relationsBegin,
752 INPUT_ITER relationsEnd,
753 OUTPUT_ITER resultOutIter,
754 UNSORTED_OUTPUT_ITER unsortedOutIter);
769 template <
class NODE_TYPE>
784template <
class NODE_TYPE>
793template <
class NODE_TYPE>
808template <
class INPUT_ITER>
812: d_predecessorCount(0)
813, d_successors(allocator)
817template <
class INPUT_ITER>
819TopologicalSortUtil_Helper<INPUT_ITER>::Links::Links(
820 const Links& original,
822: d_predecessorCount(original.d_predecessorCount)
823, d_successors(original.d_successors, allocator)
831template <
class INPUT_ITER>
833 INPUT_ITER relationsBegin,
834 INPUT_ITER relationsEnd,
836: d_workSet(allocator)
837, d_readyNodes(allocator)
842 for (INPUT_ITER iter = relationsBegin; iter != relationsEnd; ++iter) {
843 const NodeType& from = EdgeTraits::from(*iter);
844 const NodeType& to = EdgeTraits::to(*iter);
845 ++d_workSet[to].d_predecessorCount;
846 d_workSet[from].d_successors.push_back(to);
853 const LinksMapIter end = d_workSet.
end();
854 for (LinksMapIter iter = d_workSet.
begin(); iter != end; ++iter) {
855 if (0 == iter->second.d_predecessorCount) {
856 d_readyNodes.
push(iter);
862template <
class INPUT_ITER>
863template <
class OUTPUT_ITER>
865 OUTPUT_ITER *resultOutIter_p)
867 if (d_readyNodes.empty()) {
875 const LinksMapIter mapIter = d_readyNodes.front();
878 *(*resultOutIter_p) = mapIter->first;
879 ++(*resultOutIter_p);
884 for (ListIter successorIter = mapIter->second.d_successors.begin();
885 successorIter != mapIter->second.d_successors.end();
888 LinksMapIter succMapIter = d_workSet.find((*successorIter));
889 Links& succLinks = succMapIter->second;
892 if (--(succLinks.d_predecessorCount) == 0) {
894 d_readyNodes.push(succMapIter);
899 d_workSet.erase(mapIter);
904template <
class INPUT_ITER>
905template <
class OUTPUT_ITER,
class UNSORTED_OUT_ITER>
907 OUTPUT_ITER resultOutIter,
908 UNSORTED_OUT_ITER unsortedOutIter)
910 while (!d_workSet.empty()) {
911 if (!processNextNodeInOrder(&resultOutIter)) {
918 const LinksMapConstIter end = d_workSet.end();
919 for (LinksMapConstIter i = d_workSet.begin(); i != end; ++i) {
920 *unsortedOutIter = i->first;
934template <
class INPUT_ITER,
class OUTPUT_ITER,
class UNSORTED_OUT_ITER>
936 INPUT_ITER relationsEnd,
937 OUTPUT_ITER resultOutIter,
938 UNSORTED_OUT_ITER unsortedOutIter)
942 return MyHelper(relationsBegin, relationsEnd).
sortImpl(resultOutIter,
946template <
class NODE_TYPE>
954 return sort(relations.begin(),
956 bsl::back_insert_iterator<vector_type>(*result),
957 bsl::back_insert_iterator<vector_type>(*unsorted));
#define BSLMF_NESTED_TRAIT_DECLARATION(t_TYPE, t_TRAIT)
Definition bslmf_nestedtraitdeclaration.h:231
Definition bdlb_topologicalsortutil.h:576
bool sortImpl(OUTPUT_ITER resultOutIter, UNSORTED_OUT_ITER unsortedOutIter)
Definition bdlb_topologicalsortutil.h:906
bool processNextNodeInOrder(OUTPUT_ITER *resultOutIter_p)
Definition bdlb_topologicalsortutil.h:864
BSLMF_NESTED_TRAIT_DECLARATION(TopologicalSortUtil_Helper, bslma::UsesBslmaAllocator)
Definition bslstl_pair.h:1280
Definition bslstl_queue.h:324
void push(const value_type &value)
Definition bslstl_queue.h:955
Definition bslstl_unorderedmap.h:1123
iterator end() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmap.h:3386
BloombergLP::bslstl::HashTableIterator< value_type, difference_type > iterator
Definition bslstl_unorderedmap.h:1233
iterator begin() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_unorderedmap.h:3377
BloombergLP::bslstl::HashTableIterator< const value_type, difference_type > const_iterator
Definition bslstl_unorderedmap.h:1235
Definition bslstl_vector.h:1120
NodeType * iterator
Definition bslstl_vector.h:1152
NodeType const * const_iterator
Definition bslstl_vector.h:1153
Definition bslma_allocator.h:545
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bdlb_algorithmworkaroundutil.h:74
Definition bdlat_valuetypefunctions.h:939
NODE_TYPE NodeType
The type of values of the nodes of the directed acyclic graph.
Definition bdlb_topologicalsortutil.h:548
bsl::pair< NODE_TYPE, NODE_TYPE > EdgeType
The type of the directed connection from one node to another.
Definition bdlb_topologicalsortutil.h:545
Definition bdlb_topologicalsortutil.h:534
Definition bdlb_topologicalsortutil.h:703
static bool sort(INPUT_ITER relationsBegin, INPUT_ITER relationsEnd, OUTPUT_ITER resultOutIter, UNSORTED_OUTPUT_ITER unsortedOutIter)
TYPE first
Definition bslstl_pair.h:587
TYPE second
Definition bslstl_pair.h:933
Definition bslma_usesbslmaallocator.h:344