Formatting API
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / devel-api / builder / tree-node.cpp
index 8515280..0825905 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 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 <algorithm>
+#include <cctype>
 #include <cstring>
+#include <string>
 
 // INTERNAL INCLUDES
 #include "dali-toolkit/devel-api/builder/tree-node.h"
 
 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);
+}
 
-namespace Toolkit
+/**
+ * return true if the lower cased ASCII strings are equal.
+ */
+bool CaseInsensitiveStringCompare(const std::string& a, const std::string& b)
 {
+  bool result = false;
+  if(a.length() == b.length())
+  {
+    result = std::equal(a.begin(), a.end(), b.begin(), CaseInsensitiveCharacterCompare);
+  }
+  return result;
+}
 
+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
@@ -80,10 +99,9 @@ bool TreeNode::GetBoolean() const
   return mIntValue == 1 ? true : false;
 }
 
-
 size_t TreeNode::Size() const
 {
-  size_t c = 0;
+  size_t    c = 0;
   TreeNode* p = mFirstChild;
   while(p)
   {
@@ -111,7 +129,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;
     }
@@ -120,6 +138,24 @@ 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)
+    {
+      std::string nodeName(p->mName);
+      if(CaseInsensitiveStringCompare(nodeName, childName))
+      {
+        return p;
+      }
+    }
+    p = p->mNextSibling;
+  }
+  return NULL;
+}
+
 const TreeNode* TreeNode::Find(const std::string& childName) const
 {
   if(mName && std::string(mName) == childName)
@@ -137,19 +173,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)
   {
@@ -162,7 +196,7 @@ TreeNode::ConstIterator& TreeNode::ConstIterator::operator ++()
   return *this;
 }
 
-TreeNode::ConstIterator TreeNode::ConstIterator::operator ++(int)
+TreeNode::ConstIterator TreeNode::ConstIterator::operator++(int)
 {
   TreeNode::ConstIterator ret(mNode);
 
@@ -177,17 +211,12 @@ TreeNode::ConstIterator TreeNode::ConstIterator::operator ++(int)
   return ret;
 }
 
-TreeNode::KeyNodePair TreeNode::ConstIterator::operator *()
-{
-  return KeyNodePair(mNode->mName, *mNode);
-}
-
-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;
 }