use string_view to avoid temporary string allocation.
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / builder / tree-node.cpp
index 6b0f6b3..ef0071d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  */
 
 // EXTERNAL INCLUDES
-#include <cstring>
 #include <algorithm>
+#include <cctype>
+#include <string>
+#include <string_view>
 
 // INTERNAL INCLUDES
 #include "dali-toolkit/devel-api/builder/tree-node.h"
 #include "dali-toolkit/internal/builder/tree-node-manipulator.h"
 
-namespace
+namespace Dali
 {
 
-bool CaseInsensitiveCharacterCompare( unsigned char a, unsigned char b )
-{
-  // Converts to lower case in the current locale.
-  return std::tolower( a ) == std::tolower( b );
-}
-
 /**
  * return true if the lower cased ASCII strings are equal.
  */
-bool CaseInsensitiveStringCompare( const std::string& a, const std::string& b )
+bool CaseInsensitiveStringCompare(std::string_view a, std::string_view b)
 {
-  bool result = false;
-  if( a.length() == b.length() )
-  {
-    result = std::equal( a.begin(), a.end(), b.begin(), CaseInsensitiveCharacterCompare );
-  }
-  return result;
+  return (a.length() == b.length()) && std::equal(a.begin(), a.end(), b.begin(), [](auto x, auto y) {
+           return std::tolower(x) == std::tolower(y);
+         });
 }
 
-} // anonymous namespace
-
-
-namespace Dali
-{
-
 namespace Toolkit
 {
-
 TreeNode::TreeNode()
-  : mName(NULL),
-    mParent(NULL),
-    mNextSibling(NULL),
-    mFirstChild(NULL),
-    mLastChild(NULL),
-    mStringValue(NULL),
-    mType(TreeNode::IS_NULL),
-    mSubstituion(false)
+: mName(NULL),
+  mParent(NULL),
+  mNextSibling(NULL),
+  mFirstChild(NULL),
+  mLastChild(NULL),
+  mStringValue(NULL),
+  mType(TreeNode::IS_NULL),
+  mSubstituion(false)
 {
 }
 
 TreeNode::~TreeNode()
 {
-
 }
 
 const char* TreeNode::GetName() const
@@ -108,7 +93,7 @@ bool TreeNode::GetBoolean() const
 
 size_t TreeNode::Size() const
 {
-  size_t c = 0;
+  size_t    c = 0;
   TreeNode* p = mFirstChild;
   while(p)
   {
@@ -136,7 +121,7 @@ const TreeNode* TreeNode::GetChild(const std::string& childName) const
   const TreeNode* p = mFirstChild;
   while(p)
   {
-    if(p->mName && (std::string(p->mName) == childName) )
+    if(p->mName && (std::string(p->mName) == childName))
     {
       return p;
     }
@@ -145,19 +130,14 @@ const TreeNode* TreeNode::GetChild(const std::string& childName) const
   return NULL;
 }
 
-
 const TreeNode* TreeNode::GetChildIgnoreCase(const std::string& childName) const
 {
   const TreeNode* p = mFirstChild;
   while(p)
   {
-    if(p->mName)
+    if(p->mName && CaseInsensitiveStringCompare(p->mName, childName))
     {
-      std::string nodeName(p->mName);
-      if( CaseInsensitiveStringCompare( nodeName, childName) )
-      {
-        return p;
-      }
+      return p;
     }
     p = p->mNextSibling;
   }
@@ -181,19 +161,17 @@ TreeNode::ConstIterator TreeNode::CBegin() const
   return ConstIterator(mFirstChild);
 }
 
-
 TreeNode::ConstIterator TreeNode::CEnd() const
 {
   return ConstIterator(NULL);
 }
 
-
-TreeNode::ConstIterator::ConstIterator(TreeNode* v) : mNode(v)
+TreeNode::ConstIterator::ConstIterator(TreeNode* v)
+: mNode(v)
 {
-
 }
 
-TreeNode::ConstIterator& TreeNode::ConstIterator::operator ++()
+TreeNode::ConstIterator& TreeNode::ConstIterator::operator++()
 {
   if(mNode)
   {
@@ -206,7 +184,7 @@ TreeNode::ConstIterator& TreeNode::ConstIterator::operator ++()
   return *this;
 }
 
-TreeNode::ConstIterator TreeNode::ConstIterator::operator ++(int)
+TreeNode::ConstIterator TreeNode::ConstIterator::operator++(int)
 {
   TreeNode::ConstIterator ret(mNode);
 
@@ -221,12 +199,12 @@ TreeNode::ConstIterator TreeNode::ConstIterator::operator ++(int)
   return ret;
 }
 
-TreeNode::KeyNodePair TreeNode::ConstIterator::operator *()
+TreeNode::KeyNodePair TreeNode::ConstIterator::operator*()
 {
   return KeyNodePair(mNode->mName, *mNode);
 }
 
-bool TreeNode::ConstIterator::operator!=( const TreeNode::ConstIterator& rhs ) const
+bool TreeNode::ConstIterator::operator!=(const TreeNode::ConstIterator& rhs) const
 {
   return mNode != rhs.mNode;
 }