/*
- * 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
return mIntValue == 1 ? true : false;
}
-
size_t TreeNode::Size() const
{
- size_t c = 0;
+ size_t c = 0;
TreeNode* p = mFirstChild;
while(p)
{
const TreeNode* p = mFirstChild;
while(p)
{
- if(p->mName && (std::string(p->mName) == childName) )
+ if(p->mName && (std::string(p->mName) == childName))
{
return p;
}
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)
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)
{
return *this;
}
-TreeNode::ConstIterator TreeNode::ConstIterator::operator ++(int)
+TreeNode::ConstIterator TreeNode::ConstIterator::operator++(int)
{
TreeNode::ConstIterator ret(mNode);
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;
}