SkelGIS  3.0
/home/helene/Documents/These/SkelGIS/SkelGIS_Library/SkelGIS_V3/skelgis/data_structures/DDAG/dpmap_nodes_impl.hpp
00001 /*! \file pmap_nodes_impl.hpp
00002  *  \brief Definitions of the object PMap_Nodes_impl implementation to map data to the nodes of a DDAG. Three template specializations are available.
00003  */
00004 #ifndef DPMAP_NODES_IMPL_H
00005 #define DPMAP_NODES_IMPL_H
00006 
00007 #include "ddag.hpp"
00008 #include "../../iterators/DDAG/iterator.hpp"
00009 #include "../../util/communications.hpp"
00010 #include<vector>
00011 
00012 namespace skelgis{
00013 
00014   //-------------------------------------------------------------------------------
00015   //!  base template class of Property map on nodes
00016   /*!
00017     This template class defines the base PMap_Nodes_impl
00018     \tparam DD is the type of the DDAG
00019     \tparam T is the type of data in the property map
00020     \tparam overlap is the overlap size needed to compute the data
00021 
00022     for a standard type T (two first specializations) the overlap can be 0 or 1 and the size is the default one = 1
00023     for a pointer type T (two second specializations) the overlap can be any value and the size is > 1 because a table is gonna be mapped to each node
00024   */
00025   //-------------------------------------------------------------------------------
00026   template<class DD,class T, int overlap> struct DPMap_Nodes_impl;
00027   //-------------------------------------------------------------------------------
00028   //!  first specialization of DPMap_Nodes_impl
00029   /*!
00030     \tparam DD is the type of the DDAG
00031     \tparam T is the type of data in the property map
00032 
00033     The type T is a simple type in this case as float, double, int etc.
00034     The overlap is specialized to the value 1
00035   */
00036   //-------------------------------------------------------------------------------
00037   template<class DD,class T> struct DPMap_Nodes_impl<DD,T,1>
00038   //-------------------------------------------------------------------------------
00039   {
00040   protected :
00041     /*!< ddag is the pointer to the ddag data structure the property is mapped on */
00042     DDAG_impl<DD::nod,DD::edg> * ddag;
00043     /*!< object to make MPI communications */
00044     Communications<T> * comm;
00045 
00046     //-------------------------------------------------------------------------------
00047     //!  to read input initialize file
00048     /*!
00049       \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file)
00050     */
00051     //-------------------------------------------------------------------------------
00052     void read(const char * file)
00053     //-------------------------------------------------------------------------------
00054     {
00055       //parallel read to write CF DMatrix
00056       FILE *pmapfile=fopen(file,"r");
00057 
00058       T any=0;
00059       for(unsigned int i=0;i<dim_node+dim_tor;i++)
00060         {
00061           for(unsigned int j=0;j<ddag->getIndexNode(i);j++)
00062             int read = fscanf(pmapfile,"%lf", &any);
00063           int read = fscanf(pmapfile,"%lf", &data[i]);
00064           int seek = fseek(pmapfile,0,SEEK_SET);
00065         }
00066 
00067       fclose(pmapfile);
00068     }
00069     //-------------------------------------------------------------------------------
00070     //!  init function with values in file
00071     /*!
00072       \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file)
00073     */
00074     //-------------------------------------------------------------------------------
00075     void init(const char * file)
00076     //-------------------------------------------------------------------------------
00077     {
00078       dim_node = ddag->getDimNode();
00079       dim_tor = ddag->getDimTorIn()+ddag->getDimTorOut();
00080       data = new T[dim_node+dim_tor]();
00081       read(file);
00082     }
00083     //-------------------------------------------------------------------------------
00084     //!  init function with default value
00085     /*!
00086       \param val is the value to intiate nodes to
00087     */
00088     //-------------------------------------------------------------------------------
00089     void init(T val)
00090     //-------------------------------------------------------------------------------
00091     {
00092       dim_node = ddag->getDimNode();
00093       dim_tor = ddag->getDimTorIn()+ddag->getDimTorOut();
00094       data = new T[dim_node+dim_tor]();
00095       for(unsigned int i=0;i<dim_node+dim_tor;i++)
00096         {
00097           data[i] = val;
00098         }
00099     }
00100     //-------------------------------------------------------------------------------
00101     //!  init function for MPI communications
00102     /*!
00103     */
00104     //-------------------------------------------------------------------------------
00105     void init_comm()
00106     {
00107       //init the communication object
00108       comm = new Communications<T>();
00109     }
00110     //-------------------------------------------------------------------------------
00111     
00112   public:
00113     /*!< dim_node is the number of local nodes */
00114     unsigned int dim_node;
00115     /*!< dim_tor is the number of additionnal nodes to receive */
00116     unsigned int dim_tor;
00117     /*!< data mapped on nodes of the ddag */
00118     T * data;
00119 
00120     //-------------------------------------------------------------------------------
00121     //!  constructor
00122     /*!
00123       \param dag is the DDAG the property is going to mapped
00124       \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file)
00125     */
00126     //-------------------------------------------------------------------------------
00127     DPMap_Nodes_impl(DD &dag, const char * file)
00128     //-------------------------------------------------------------------------------
00129     {
00130       ddag = dag.getDDAG_impl();
00131       //communication initialization
00132       init_comm();
00133       //construction of data and read the file
00134       init(file);
00135     }
00136     //-------------------------------------------------------------------------------
00137     //!  constructor of DPMap_Nodes
00138     /*!
00139       \param dag is the DDAG object associated to this map
00140       \param val is the default value of nodes for the map
00141     */
00142     //-------------------------------------------------------------------------------
00143     DPMap_Nodes_impl(DD &dag, T val)
00144     //-------------------------------------------------------------------------------
00145     {
00146       ddag = dag.getDDAG_impl();
00147       //communication initialization
00148       init_comm();
00149       //construction of data and fill with val
00150       init(val);
00151     }
00152     //-------------------------------------------------------------------------------
00153     //!  destructor of DPMap_Nodes
00154     /*!
00155     */
00156     //-------------------------------------------------------------------------------
00157     ~DPMap_Nodes_impl()
00158     //-------------------------------------------------------------------------------
00159     {
00160       delete [] data;
00161       delete comm;
00162     }
00163     //-------------------------------------------------------------------------------
00164     //!  to get the begin iterator on roots nodes
00165     /*!
00166       \return the begin iterator on roots nodes
00167     */
00168     //-------------------------------------------------------------------------------
00169     inline iterator_dag begin_roots(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs());}
00170     //-------------------------------------------------------------------------------
00171     //!  to get the end iterator on roots nodes
00172     /*!
00173       \return the end iterator on roots nodes
00174     */
00175     //-------------------------------------------------------------------------------
00176     inline iterator_dag end_roots(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs()+ddag->getDimRoots());}
00177     //-------------------------------------------------------------------------------
00178     //!  to get the begin iterator on leafs nodes
00179     /*!
00180       \return the begin iterator on leafs nodes
00181     */
00182     //-------------------------------------------------------------------------------
00183     inline iterator_dag begin_leafs(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());}
00184     //-------------------------------------------------------------------------------
00185     //!  to get the end iterator on leafs nodes
00186     /*!
00187       \return the end iterator on leafs nodes
00188     */
00189     //-------------------------------------------------------------------------------
00190     inline iterator_dag end_leafs(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs());}
00191     //-------------------------------------------------------------------------------
00192     //!  to get the begin iterator on nodes with communication with other processors
00193     /*!
00194       \return the begin iterator on communication nodes
00195     */
00196     //-------------------------------------------------------------------------------
00197     inline iterator_dag begin_comm(){return iterator_dag(ddag->getDimLoc());}
00198     //-------------------------------------------------------------------------------
00199     //!  to get the end iterator on nodes with communication with other processors
00200     /*!
00201       \return the end iterator on communication nodes
00202     */
00203     //-------------------------------------------------------------------------------
00204     inline iterator_dag end_comm(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());}
00205     //-------------------------------------------------------------------------------
00206     //!  to get the begin iterator on nodes without communication with other processors
00207     /*!
00208       \return the begin iterator on local nodes
00209     */
00210     //-------------------------------------------------------------------------------
00211     inline iterator_dag begin_loc(){return iterator_dag(0);}
00212     //-------------------------------------------------------------------------------
00213     //!  to get the end iterator on nodes without communication with other processors
00214     /*!
00215       \return the end iterator on local nodes
00216     */
00217     //-------------------------------------------------------------------------------
00218     inline iterator_dag end_loc(){return iterator_dag(ddag->getDimLoc());}
00219     //-------------------------------------------------------------------------------
00220     //!  to get the begin iterator on inside nodes (i.e. nodes that are not roots or leafs = loc and comm nodes)
00221     /*!
00222       \return the begin iterator on inside nodes
00223     */
00224     //-------------------------------------------------------------------------------
00225     inline iterator_dag begin_in(){return iterator_dag(0);}
00226     //-------------------------------------------------------------------------------
00227     //!  to get the end iterator on inside nodes (i.e. nodes that are not roots or leafs = loc and comm nodes)
00228     /*!
00229       \return the end iterator on inside nodes
00230     */
00231     //-------------------------------------------------------------------------------
00232     inline iterator_dag end_in(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());}
00233     //-------------------------------------------------------------------------------
00234     //!  to get the begin iterator on all nodes (roots, leafs, comm and loc)
00235     /*!
00236       \return the begin iterator on all nodes
00237     */
00238     //-------------------------------------------------------------------------------
00239     inline iterator_dag begin_all(){return iterator_dag(0);}
00240     //-------------------------------------------------------------------------------
00241     //!  to get the end iterator on all nodes (roots, leafs, comm and loc)
00242     /*!
00243       \return the end iterator on all nodes
00244     */
00245     //-------------------------------------------------------------------------------
00246     inline iterator_dag end_all(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs()+ddag->getDimRoots());}
00247     //-------------------------------------------------------------------------------
00248     //!  to get a vector of iterator on input edges for the node it
00249     /*!
00250       \param it is the iterator on the node to get input edges
00251       \return a vector of iterator
00252     */
00253     //-------------------------------------------------------------------------------
00254     inline std::vector<iterator_dag> getInEdges(iterator_dag it){return ddag->getInEdges(it._rank);}
00255     //-------------------------------------------------------------------------------
00256     //!  to get a vector of iterator on output edges for the node it
00257     /*!
00258       \param it is the iterator on the node to get output edges
00259       \return a vector of iterator
00260     */
00261     //-------------------------------------------------------------------------------
00262     inline std::vector<iterator_dag> getOutEdges(iterator_dag it){return ddag->getOutEdges(it._rank);}
00263     //-------------------------------------------------------------------------------
00264     //!  to get a vector of iterator on input nodes for the node it
00265     /*!
00266       \param it is the iterator on the node to get input nodes
00267       \return a vector of iterator
00268     */
00269     //-------------------------------------------------------------------------------
00270     inline std::vector<iterator_dag> getInNodes(iterator_dag it){return ddag->getInNodes(it._rank);}
00271     //-------------------------------------------------------------------------------
00272     //!  to get a vector of iterator on output nodes for the node it
00273     /*!
00274       \param it is the iterator on the node to get output nodes
00275       \return a vector of iterator
00276     */
00277     //-------------------------------------------------------------------------------
00278     inline std::vector<iterator_dag> getOutNodes(iterator_dag it){return ddag->getOutNodes(it._rank);}
00279     //-------------------------------------------------------------------------------
00280     //!  start the communication process for the dpmap_nodes property
00281     /*!
00282       prepare data to send
00283       launch non blocking MPI communications
00284     */
00285     //-------------------------------------------------------------------------------
00286     void start_communications()
00287     //-------------------------------------------------------------------------------
00288     {
00289       for(int j=0;j<Mpi_::mpi_nb;j++)
00290         {
00291           //prepare data to send
00292           unsigned int nb_toSend = ddag->getNbNodesToSend(j);
00293           if(nb_toSend>0)
00294             {
00295               T * toSend = (T*)calloc(nb_toSend,sizeof(T));
00296               unsigned int * indexes = ddag->getNodesToSend(j);
00297               for(unsigned int i=0;i<nb_toSend;i++)
00298                 toSend[i] = data[indexes[i]];
00299 
00300               comm->ISend(toSend, nb_toSend, j);
00301 
00302               free(indexes);
00303               free(toSend);
00304             }
00305           //prepare data to receive
00306           unsigned int nb_toRecv = ddag->getNbNodesToRecv(j);
00307           if(nb_toRecv>0)
00308             comm->IRecv(nb_toRecv, j);
00309          
00310         }
00311     }
00312     //-------------------------------------------------------------------------------
00313     //!  end the communication process for the dpmap_nodes property
00314     /*!
00315       wait for the end of non-blocking communications
00316       put received values in the dpmap_nodes property
00317     */
00318     //-------------------------------------------------------------------------------
00319     void end_communications()
00320     //-------------------------------------------------------------------------------
00321     {
00322       for(int j=0;j<Mpi_::mpi_nb;j++)
00323         {
00324           //prepare data to send
00325           unsigned int nb_toSend = ddag->getNbNodesToSend(j);
00326           if(nb_toSend>0)
00327             comm->Wait_s(j);
00328           unsigned int nb_toRecv = ddag->getNbNodesToRecv(j);
00329           if(nb_toRecv>0)
00330             {
00331               T * toRecv = (T*)calloc(nb_toRecv,sizeof(T));
00332               comm->Wait_r(toRecv,j,nb_toRecv);
00333               unsigned int * indexes = ddag->getNodesToRecv(j);
00334               //change values in data
00335               for(int k=0;k<nb_toRecv;k++)
00336                 data[indexes[k]] = toRecv[k];
00337               free(indexes);
00338               free(toRecv);
00339             }
00340         }
00341     }
00342     //-------------------------------------------------------------------------------
00343   };
00344   //-------------------------------------------------------------------------------
00345   //!  second specialization of DPMap_Nodes_impl
00346   /*!
00347     \tparam DD is the type of the DDAG
00348     \tparam T is the type of data in the property map
00349 
00350     The type T is a simple type in this case as float, double, int etc.
00351     The overlap is specialized to the value 0
00352   */
00353   //-------------------------------------------------------------------------------
00354   template<class DD, class T> struct DPMap_Nodes_impl<DD,T,0>
00355   {
00356     protected :
00357     /*!< ddag is the pointer to the ddag data structure the property is mapped on */
00358     DDAG_impl<DD::nod,DD::edg> * ddag;
00359 
00360     //-------------------------------------------------------------------------------
00361     //!  to read input initialize file
00362     /*!
00363       \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file)
00364     */
00365     //-------------------------------------------------------------------------------
00366     void read(const char * file)
00367     //-------------------------------------------------------------------------------
00368     {
00369       //parallel read to write CF DMatrix
00370       FILE *pmapfile=fopen(file,"r");
00371 
00372       T any=0;
00373       for(unsigned int i=0;i<dim_node;i++)
00374         {
00375           for(unsigned int j=0;j<ddag->getIndexNode(i);j++)
00376             int read = fscanf(pmapfile,"%lf", &any);
00377           int read = fscanf(pmapfile,"%lf", &data[i]);
00378           int seek = fseek(pmapfile,0,SEEK_SET);
00379         }
00380 
00381       fclose(pmapfile);
00382     }
00383     //-------------------------------------------------------------------------------
00384     //!  init function with values in file
00385     /*!
00386       \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file)
00387     */
00388     //-------------------------------------------------------------------------------
00389     void init(const char * file)
00390     //-------------------------------------------------------------------------------
00391     {
00392       dim_node = ddag->getDimNode();
00393       data = new T[dim_node]();
00394       read(file);
00395     }
00396     //-------------------------------------------------------------------------------
00397     //!  init function with default value
00398     /*!
00399       \param val is the value to intiate nodes to
00400     */
00401     //-------------------------------------------------------------------------------
00402     void init(T val)
00403     //-------------------------------------------------------------------------------
00404     {
00405       dim_node = ddag->getDimNode();
00406       data = new T[dim_node]();
00407       for(unsigned int i=0;i<dim_node;i++)
00408         {
00409           data[i] = val;
00410         }
00411     }
00412     
00413   public:
00414     /*!< dim_node is the number of local nodes */
00415     unsigned int dim_node;
00416     /*!< data mapped on nodes of the ddag */
00417     T * data;
00418 
00419     //-------------------------------------------------------------------------------
00420     //!  constructor
00421     /*!
00422       \param dag is the DDAG the property is going to mapped
00423       \param file is the file of intial values for this property on nodes (each line is the value of the node "number of this line" associated in the .dot file)
00424     */
00425     //-------------------------------------------------------------------------------
00426     DPMap_Nodes_impl(DD &dag, const char * file)
00427     //-------------------------------------------------------------------------------
00428     {
00429       ddag = dag.getDDAG_impl();
00430       //construction of data and read the file
00431       init(file);
00432     }
00433     //-------------------------------------------------------------------------------
00434     //!  constructor of DPMap_Nodes
00435     /*!
00436       \param dag is the DDAG object associated to this map
00437       \param val is the default value of nodes for the map
00438     */
00439     //-------------------------------------------------------------------------------
00440     DPMap_Nodes_impl(DD &dag, T val)
00441     //-------------------------------------------------------------------------------
00442     {
00443       ddag = dag.getDDAG_impl();
00444       //construction of data and fill with val
00445       init(val);
00446     }
00447     //-------------------------------------------------------------------------------
00448     //!  destructor of DPMap_Nodes
00449     /*!
00450     */
00451     //-------------------------------------------------------------------------------
00452     ~DPMap_Nodes_impl()
00453     //-------------------------------------------------------------------------------
00454     {
00455       delete [] data;
00456     }
00457     //-------------------------------------------------------------------------------
00458     //!  to get the begin iterator on roots nodes
00459     /*!
00460       \return the begin iterator on roots nodes
00461     */
00462     //-------------------------------------------------------------------------------
00463     inline iterator_dag begin_roots(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs());}
00464     //-------------------------------------------------------------------------------
00465     //!  to get the end iterator on roots nodes
00466     /*!
00467       \return the end iterator on roots nodes
00468     */
00469     //-------------------------------------------------------------------------------
00470     inline iterator_dag end_roots(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs()+ddag->getDimRoots());}
00471     //-------------------------------------------------------------------------------
00472     //!  to get the begin iterator on leafs nodes
00473     /*!
00474       \return the begin iterator on leafs nodes
00475     */
00476     //-------------------------------------------------------------------------------
00477     inline iterator_dag begin_leafs(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());}
00478     //-------------------------------------------------------------------------------
00479     //!  to get the end iterator on leafs nodes
00480     /*!
00481       \return the end iterator on leafs nodes
00482     */
00483     //-------------------------------------------------------------------------------
00484     inline iterator_dag end_leafs(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm()+ddag->getDimLeafs());}
00485     //-------------------------------------------------------------------------------
00486     //!  to get the begin iterator on nodes with communication with other processors
00487     /*!
00488       \return the begin iterator on communication nodes
00489     */
00490     //-------------------------------------------------------------------------------
00491     inline iterator_dag begin_comm(){return iterator_dag(ddag->getDimLoc());}
00492     //-------------------------------------------------------------------------------
00493     //!  to get the end iterator on nodes with communication with other processors
00494     /*!
00495       \return the end iterator on communication nodes
00496     */
00497     //-------------------------------------------------------------------------------
00498     inline iterator_dag end_comm(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());}
00499     //-------------------------------------------------------------------------------
00500     //!  to get the begin iterator on nodes without communication with other processors
00501     /*!
00502       \return the begin iterator on local nodes
00503     */
00504     //-------------------------------------------------------------------------------
00505     inline iterator_dag begin_loc(){return iterator_dag(0);}
00506     //-------------------------------------------------------------------------------
00507     //!  to get the end iterator on nodes without communication with other processors
00508     /*!
00509       \return the end iterator on local nodes
00510     */
00511     //-------------------------------------------------------------------------------
00512     inline iterator_dag end_loc(){return iterator_dag(ddag->getDimLoc());}
00513     //-------------------------------------------------------------------------------
00514     //!  to get the begin iterator on inside nodes (i.e. nodes that are not roots or leafs = loc and comm nodes)
00515     /*!
00516       \return the begin iterator on inside nodes
00517     */
00518     //-------------------------------------------------------------------------------
00519     inline iterator_dag begin_in(){return iterator_dag(0);}
00520     //-------------------------------------------------------------------------------
00521     //!  to get the end iterator on inside nodes (i.e. nodes that are not roots or leafs = loc and comm nodes)
00522     /*!
00523       \return the end iterator on inside nodes
00524     */
00525     //-------------------------------------------------------------------------------
00526     inline iterator_dag end_in(){return iterator_dag(ddag->getDimLoc()+ddag->getDimComm());}
00527     //-------------------------------------------------------------------------------
00528     //!  to get a vector of iterator on input edges for the node it
00529     /*!
00530       \param it is the iterator on the node to get input edges
00531       \return a vector of iterator
00532     */
00533     //-------------------------------------------------------------------------------
00534     inline std::vector<iterator_dag> getInEdges(iterator_dag it){return ddag->getInEdges(it._rank);}
00535     //-------------------------------------------------------------------------------
00536     //!  to get a vector of iterator on output edges for the node it
00537     /*!
00538       \param it is the iterator on the node to get output edges
00539       \return a vector of iterator
00540     */
00541     //-------------------------------------------------------------------------------
00542     inline std::vector<iterator_dag> getOutEdges(iterator_dag it){return ddag->getOutEdges(it._rank);}
00543     //-------------------------------------------------------------------------------
00544     //!  to get a vector of iterator on input nodes for the node it
00545     /*!
00546       \param it is the iterator on the node to get input nodes
00547       \return a vector of iterator
00548     */
00549     //-------------------------------------------------------------------------------
00550     inline std::vector<iterator_dag> getInNodes(iterator_dag it){return ddag->getInNodes(it._rank);}
00551     //-------------------------------------------------------------------------------
00552     //!  to get a vector of iterator on output nodes for the node it
00553     /*!
00554       \param it is the iterator on the node to get output nodes
00555       \return a vector of iterator
00556     */
00557     //-------------------------------------------------------------------------------
00558     inline std::vector<iterator_dag> getOutNodes(iterator_dag it){return ddag->getOutNodes(it._rank);}
00559     //-------------------------------------------------------------------------------
00560     //!  start the communication process for the dpmap_nodes property
00561     /*!
00562       prepare data to send
00563       launch non blocking MPI communications
00564     */
00565     //-------------------------------------------------------------------------------
00566     inline void start_communications(){}
00567     //-------------------------------------------------------------------------------
00568     //!  end the communication process for the dpmap_nodes property
00569     /*!
00570       wait for the end of non-blocking communications
00571       put received values in the dpmap_nodes property
00572     */
00573     //-------------------------------------------------------------------------------
00574     inline void end_communications(){}
00575     //-------------------------------------------------------------------------------
00576 
00577   };
00578   //-------------------------------------------------------------------------------
00579   //!  third specialization of DPMap_Nodes_impl
00580   /*!
00581     \tparam DD is the type of the DDAG
00582     \tparam T is the type of data in the property map
00583     \tapram overlap is the overlap size needed to compute the data
00584 
00585     The type T is specialized with a specific pointer type in this case as float*, double*, int* etc.
00586     The overlap is not specialized and is [0,...,size]
00587     The size is not specialized, it is the number of elements in the pointer table to map
00588   */
00589   //-------------------------------------------------------------------------------
00590   template<class DD, class T,int overlap> struct DPMap_Nodes_impl<DD,T*,overlap>
00591   {
00592   protected :
00593 
00594   public:
00595     DPMap_Nodes_impl(){};
00596     ~DPMap_Nodes_impl(){};
00597   };
00598   //-------------------------------------------------------------------------------
00599   //!  fourth specialization of DPMap_Nodes_impl
00600   /*!
00601     \tparam DD is the type of the DDAG
00602     \tparam T is the type of data in the property map
00603     \tapram overlap is the overlap size needed to compute the data
00604 
00605     The type T is specialized with a specific pointer type in this case as float*, double*, int* etc.
00606     The overlap is specialized to the value 0
00607     The size is not specialized, it is the number of elements in the pointer table to map
00608   */
00609   //-------------------------------------------------------------------------------
00610   template<class DD, class T> struct DPMap_Nodes_impl<DD,T*,0>
00611   {
00612   protected :
00613 
00614   public:
00615     DPMap_Nodes_impl(){};
00616     ~DPMap_Nodes_impl(){};
00617   };
00618 
00619 };
00620 
00621 
00622 #endif
 All Classes Files Functions Variables Defines