Merge branch 'pm/sptree' into charm.
authorRamprasad Venkataraman <ramv@illinois.edu>
Mon, 8 Mar 2010 16:40:20 +0000 (10:40 -0600)
committerRamprasad Venkataraman <ramv@illinois.edu>
Mon, 8 Mar 2010 16:40:20 +0000 (10:40 -0600)
Use overloading for cleaner implementation of topo::buildSpanningTree*()
Changes are as discussed
Trivial additions to make comments doxygen-friendly

1  2 
src/util/spanningTreeStrategy.h

index af67b91a7aa092a039605dc4c13cd4aa55029e50,9df4b5eb78a371d92ed3c5a0684c5aa56239c100..e10e0745d0c921ef6b9edcbf145f97f60037354b
@@@ -119,15 -119,25 +119,29 @@@ class SpanningTreeVertex
  template <typename Iterator,typename ValueType = typename std::iterator_traits<Iterator>::value_type>
  class SpanningTreeStrategy;
  
++//@{
  /// Builds one generation of the spanning tree given a container of vertices with the tree root as the first element in the container
+ // Use a default strategy
  template <typename Iterator>
  SpanningTreeVertex* buildSpanningTreeGeneration
- (const Iterator firstVtx, const Iterator beyondLastVtx, const int maxBranches=2, SpanningTreeStrategy<Iterator> *bldr = 0);
+ (const Iterator firstVtx, const Iterator beyondLastVtx, const int maxBranches=2);
+ // Use the strategy provided by the caller
+ template <typename Iterator>
+ SpanningTreeVertex* buildSpanningTreeGeneration
+ (const Iterator firstVtx, const Iterator beyondLastVtx, const int maxBranches, SpanningTreeStrategy<Iterator> *bldr);
++//@}
  
++//@{
  /// Builds the complete spanning tree given a container of vertices with the tree root as the first element in the container
+ // Use a default strategy
+ template <typename Iterator>
+ void buildSpanningTree
+ (const Iterator firstVtx, const Iterator beyondLastVtx, const int maxBranches=2);
+ // Use the strategy provided by the caller
  template <typename Iterator>
  void buildSpanningTree
- (const Iterator firstVtx, const Iterator beyondLastVtx, const int maxBranches=2, SpanningTreeStrategy<Iterator> *bldr = 0);
+ (const Iterator firstVtx, const Iterator beyondLastVtx, const int maxBranches, SpanningTreeStrategy<Iterator> *bldr);
++//@}
  
  /// Tiny factory method that returns a tree construction strategy that it thinks is best (based on inputs, the machine's network topology info etc)
  template <typename Iterator>
@@@ -185,29 -195,26 +199,29 @@@ inline SpanningTreeVertex* buildSpannin
  
      /// Validate input. Invalid inputs are not exceptions. They are just no-ops
      if (maxBranches < 1 || firstVtx == beyondLastVtx)
-         return (result = new SpanningTreeVertex() );
-     // Should the tree builder strategy object be deleted?
-     bool shouldDelete = false;
-     /// If no strategy is passed in, instantiate one
-     if (bldr == 0)
-     {
-         bldr = getSpanningTreeStrategy(firstVtx,beyondLastVtx,maxBranches);
-         /// and remember to delete it after you're done
-         shouldDelete = true;
-     }
+         return new SpanningTreeVertex();
+     else
+       /// Delegate the actual work
+       return bldr->buildNextGen(firstVtx,beyondLastVtx,maxBranches);
+ }
 +
-     /// Delegate the actual work
-     result = bldr->buildNextGen(firstVtx,beyondLastVtx,maxBranches);
 +
-     if (shouldDelete) delete bldr;
+ // Overload to automatically use the default strategy
+ template <typename Iterator>
+ inline SpanningTreeVertex* buildSpanningTreeGeneration(const Iterator firstVtx,
+                                                        const Iterator beyondLastVtx,
+                                                        const int maxBranches
+                                                       )
+ {
+     SpanningTreeStrategy<Iterator> *bldr =
+       getSpanningTreeStrategy(firstVtx,beyondLastVtx,maxBranches);
+     SpanningTreeVertex *result = buildSpanningTreeGeneration(firstVtx, beyondLastVtx, maxBranches, bldr);
+     delete bldr;
      return result;
  }
  
  
 +
  /// Nested namespace to prevent the implementation muck from polluting topo::
  namespace impl {
  
@@@ -275,8 -274,18 +281,20 @@@ inline void buildSpanningTree(const Ite
      typename std::iterator_traits<Iterator>::value_type *tag = 0;
      /// Delegate the work
      impl::buildSpanningTree(tag,firstVtx,beyondLastVtx,maxBranches,bldr);
-     /// Delete the builder if it was not passed in
-     if (shouldDelete) delete bldr;
+ }
++
++
+ // Overload to automatically use the default strategy
+ template <typename Iterator>
+ inline void buildSpanningTree(const Iterator firstVtx,
+                               const Iterator beyondLastVtx,
+                               const int maxBranches
+                              )
+ {
+     SpanningTreeStrategy<Iterator> *bldr =
+       getSpanningTreeStrategy(firstVtx,beyondLastVtx,maxBranches);
+     buildSpanningTree(firstVtx, beyondLastVtx, maxBranches, bldr);
+     delete bldr;
  }
  
  } // end namespace topo