getnext is not needed. Maps have a built in iterator that can/should be used 
directly
At least that is the pattern followed so far.
/HansF

> -----Original Message-----
> From: nagendr...@oracle.com [mailto:nagendr...@oracle.com]
> Sent: den 21 maj 2014 12:00
> To: Hans Feldt; Hans Nordebäck; praveen.malv...@oracle.com
> Cc: opensaf-devel@lists.sourceforge.net
> Subject: [PATCH 1 of 1] amfd: replace patricia tree with stl::maps in 
> nodegroup [#713]
> 
>  osaf/services/saf/amf/amfd/include/db_template.h |  17 ++++++
>  osaf/services/saf/amf/amfd/include/node.h        |   2 +-
>  osaf/services/saf/amf/amfd/nodegroup.cc          |  61 
> ++++++-----------------
>  3 files changed, 35 insertions(+), 45 deletions(-)
> 
> 
> diff --git a/osaf/services/saf/amf/amfd/include/db_template.h 
> b/osaf/services/saf/amf/amfd/include/db_template.h
> --- a/osaf/services/saf/amf/amfd/include/db_template.h
> +++ b/osaf/services/saf/amf/amfd/include/db_template.h
> @@ -27,6 +27,7 @@ class AmfDb {
>     unsigned int insert(T *obj);
>     void erase(T *obj);
>     T *find(const SaNameT *name);
> +   T *getnext(const SaNameT *name);
> 
>     typedef std::map<std::string, T*> AmfDbMap;
>     typedef typename AmfDbMap::const_iterator const_iterator;
> @@ -68,4 +69,20 @@ T *AmfDb<T>::find(const SaNameT *dn) {
>      return it->second;
>  }
> 
> +template <typename T>
> +T *AmfDb<T>::getnext(const SaNameT *dn) {
> +  osafassert(dn);
> +  std::string name((const char*)dn->value, dn->length);
> +  typename AmfDbMap::iterator it = db.find(name);
> +  if (it == db.end())
> +    return NULL;
> +  else {
> +       it++;
> +       if (it == db.end())
> +               return NULL;
> +       else
> +               return it->second;
> +  }
> +}
> +
>  #endif       /* DB_TEMPLATE_H */
> diff --git a/osaf/services/saf/amf/amfd/include/node.h 
> b/osaf/services/saf/amf/amfd/include/node.h
> --- a/osaf/services/saf/amf/amfd/include/node.h
> +++ b/osaf/services/saf/amf/amfd/include/node.h
> @@ -147,7 +147,7 @@ typedef struct avd_avnd_tag {
>  typedef struct avd_ng_tag {
> 
>       NCS_PATRICIA_NODE tree_node;    /* key will be AMF  node group name */
> -     SaNameT ng_name;
> +     SaNameT name;
>       uint32_t number_nodes;  /* number of element in saAmfNGNodeList */
>       SaNameT *saAmfNGNodeList;       /* array of node names in group */
> 
> diff --git a/osaf/services/saf/amf/amfd/nodegroup.cc 
> b/osaf/services/saf/amf/amfd/nodegroup.cc
> --- a/osaf/services/saf/amf/amfd/nodegroup.cc
> +++ b/osaf/services/saf/amf/amfd/nodegroup.cc
> @@ -23,17 +23,7 @@
>  #include <cluster.h>
>  #include <imm.h>
> 
> -static NCS_PATRICIA_TREE nodegroup_db;
> -
> -/**
> - * Add a node group object to the db.
> - * @param ng
> - */
> -static void ng_db_add(AVD_AMF_NG *ng)
> -{
> -     unsigned int rc = ncs_patricia_tree_add(&nodegroup_db, &ng->tree_node);
> -     osafassert(rc == NCSCC_RC_SUCCESS);
> -}
> +AmfDb<AVD_AMF_NG> *nodegroup_db = 0;
> 
>  /**
>   * Lookup object in db using dn
> @@ -43,12 +33,7 @@ static void ng_db_add(AVD_AMF_NG *ng)
>   */
>  AVD_AMF_NG *avd_ng_get(const SaNameT *dn)
>  {
> -     SaNameT tmp = {0};
> -
> -     tmp.length = dn->length;
> -     memcpy(tmp.value, dn->value, tmp.length);
> -
> -     return (AVD_AMF_NG *)ncs_patricia_tree_get(&nodegroup_db, (uint8_t 
> *)&tmp);
> +     return nodegroup_db->find(dn);
>  }
> 
>  /**
> @@ -59,12 +44,7 @@ AVD_AMF_NG *avd_ng_get(const SaNameT *dn
>   */
>  static AVD_AMF_NG *ng_getnext(const SaNameT *dn)
>  {
> -     SaNameT tmp = {0};
> -
> -     tmp.length = dn->length;
> -     memcpy(tmp.value, dn->value, tmp.length);
> -
> -     return (AVD_AMF_NG *)ncs_patricia_tree_getnext(&nodegroup_db, (uint8_t 
> *)&tmp);
> +     return nodegroup_db->getnext(dn);
>  }
> 
>  /**
> @@ -138,9 +118,9 @@ static AVD_AMF_NG *ng_create(SaNameT *dn
> 
>       ng = new AVD_AMF_NG();
> 
> -     memcpy(ng->ng_name.value, dn->value, dn->length);
> -     ng->ng_name.length = dn->length;
> -     ng->tree_node.key_info = (uint8_t *)&(ng->ng_name);
> +     memcpy(ng->name.value, dn->value, dn->length);
> +     ng->name.length = dn->length;
> +     ng->tree_node.key_info = (uint8_t *)&(ng->name);
> 
>       if 
> ((immutil_getAttrValuesNumber(const_cast<SaImmAttrNameT>("saAmfNGNodeList"), 
> attributes,
>               &values_number) == SA_AIS_OK) && (values_number > 0)) {
> @@ -174,10 +154,7 @@ done:
>   */
>  static void ng_delete(AVD_AMF_NG *ng)
>  {
> -     unsigned int rc = ncs_patricia_tree_del(&nodegroup_db, &ng->tree_node);
> -     osafassert(rc == NCSCC_RC_SUCCESS);
> -
> -     osafassert(ng);
> +     nodegroup_db->erase(ng);
>       free(ng->saAmfNGNodeList);
>       delete ng;
>  }
> @@ -228,7 +205,7 @@ SaAisErrorT avd_ng_config_get(void)
>               if ((ng = ng_create(&dn, (const SaImmAttrValuesT_2 
> **)attributes)) == NULL)
>                       goto done2;
> 
> -             ng_db_add(ng);
> +             nodegroup_db->insert(ng);
>       }
> 
>       rc = SA_AIS_OK;
> @@ -249,10 +226,10 @@ done1:
>   */
>  static bool su_is_mapped_to_node_via_nodegroup(const AVD_SU *su, const 
> AVD_AMF_NG *ng)
>  {
> -     if ((memcmp(&ng->ng_name, &su->saAmfSUHostNodeOrNodeGroup, 
> sizeof(SaNameT)) == 0) ||
> -         (memcmp(&ng->ng_name, &su->sg_of_su->saAmfSGSuHostNodeGroup, 
> sizeof(SaNameT)) == 0)) {
> +     if ((memcmp(&ng->name, &su->saAmfSUHostNodeOrNodeGroup, 
> sizeof(SaNameT)) == 0) ||
> +         (memcmp(&ng->name, &su->sg_of_su->saAmfSGSuHostNodeGroup, 
> sizeof(SaNameT)) == 0)) {
> 
> -             TRACE("SU '%s' mapped using '%s'", su->name.value, 
> ng->ng_name.value);
> +             TRACE("SU '%s' mapped using '%s'", su->name.value, 
> ng->name.value);
>               return true;
>       }
> 
> @@ -337,7 +314,7 @@ static SaAisErrorT ng_ccb_completed_modi
>                                       if 
> (su_is_mapped_to_node_via_nodegroup(su, ng)) {
>                                               
> report_ccb_validation_error(opdata, "Cannot delete '%s' from '%s'."
>                                                               " An SU is 
> mapped using node group",
> -                                                             
> node->name.value, ng->ng_name.value);
> +                                                             
> node->name.value, ng->name.value);
>                                               goto done;
> 
>                                       }
> @@ -348,7 +325,7 @@ static SaAisErrorT ng_ccb_completed_modi
>                                       if 
> (su_is_mapped_to_node_via_nodegroup(su, ng)) {
>                                               
> report_ccb_validation_error(opdata, "Cannot delete '%s' from '%s'."
>                                                               " An SU is 
> mapped using node group",
> -                                                             
> node->name.value, ng->ng_name.value);
> +                                                             
> node->name.value, ng->name.value);
>                                               goto done;
>                                       }
>                               }
> @@ -444,7 +421,7 @@ static SaAisErrorT ng_ccb_completed_dele
>                       if (su_is_mapped_to_node_via_nodegroup(su, ng) &&
>                           is_deleted_in_ccb(opdata->ccbId, &su->name) == 
> false) {
>                               report_ccb_validation_error(opdata, "Cannot 
> delete '%s' because '%s' is mapped using it",
> -                                     ng->ng_name.value, su->name.value);
> +                                     ng->name.value, su->name.value);
>                               goto done;
>                       }
>               }
> @@ -453,7 +430,7 @@ static SaAisErrorT ng_ccb_completed_dele
>                       if (su_is_mapped_to_node_via_nodegroup(su, ng) &&
>                           is_deleted_in_ccb(opdata->ccbId, &su->name) == 
> false) {
>                               report_ccb_validation_error(opdata, "Cannot 
> delete '%s' because '%s' is mapped using it",
> -                                     ng->ng_name.value, su->name.value);
> +                                     ng->name.value, su->name.value);
>                               goto done;
>                       }
>               }
> @@ -571,7 +548,7 @@ static void ng_ccb_apply_cb(CcbUtilOpera
>       case CCBUTIL_CREATE:
>               ng = ng_create(&opdata->objectName, 
> opdata->param.create.attrValues);
>               osafassert(ng);
> -             ng_db_add(ng);
> +             nodegroup_db->insert(ng);
>               break;
>       case CCBUTIL_MODIFY:
>               ng_ccb_apply_modify_hdlr(opdata);
> @@ -593,11 +570,7 @@ static void ng_ccb_apply_cb(CcbUtilOpera
>   */
>  void avd_ng_constructor(void)
>  {
> -     NCS_PATRICIA_PARAMS patricia_params;
> -
> -     patricia_params.key_size = sizeof(SaNameT);
> -     osafassert(ncs_patricia_tree_init(&nodegroup_db, &patricia_params) == 
> NCSCC_RC_SUCCESS);
> -
> +     nodegroup_db = new AmfDb<AVD_AMF_NG>;
>       avd_class_impl_set("SaAmfNodeGroup", NULL, NULL, ng_ccb_completed_cb,
>                       ng_ccb_apply_cb);
>  }

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to