/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 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"
namespace Dali
{
+/**
+ * return true if the lower cased ASCII strings are equal.
+ */
+bool CaseInsensitiveStringCompare(std::string_view a, std::string_view b)
+{
+ return (a.length() == b.length()) && std::equal(a.begin(), a.end(), b.begin(), [](auto x, auto y) {
+ return std::tolower(x) == std::tolower(y);
+ });
+}
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)
{
return c;
}
-size_t TreeNode::Count(const std::string& childName) const
+size_t TreeNode::Count(std::string_view childName) const
{
const TreeNode* c = GetChild(childName);
if(c)
}
}
-const TreeNode* TreeNode::GetChild(const std::string& childName) const
+const TreeNode* TreeNode::GetChild(std::string_view childName) const
{
const TreeNode* p = mFirstChild;
while(p)
{
- if(p->mName && (std::string(p->mName) == childName) )
+ if(p->mName && (std::string_view(p->mName) == childName))
{
return p;
}
return NULL;
}
-const TreeNode* TreeNode::Find(const std::string& childName) const
+const TreeNode* TreeNode::GetChildIgnoreCase(std::string_view childName) const
{
- if(mName && std::string(mName) == childName)
+ const TreeNode* p = mFirstChild;
+ while(p)
+ {
+ if(p->mName && CaseInsensitiveStringCompare(p->mName, childName))
+ {
+ return p;
+ }
+ p = p->mNextSibling;
+ }
+ return NULL;
+}
+
+const TreeNode* TreeNode::Find(std::string_view childName) const
+{
+ if(mName && std::string_view(mName) == childName)
{
return this;
}
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 *()
+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;
}