// Created by: DAUTRY Philippe
// Copyright (c) 1997-1999 Matra Datavision
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.

//              --------------

// Version:     0.0
// Version Date            Purpose
//              0.0     Feb  7 1997     Creation

#include "TDF_LabelNode.hxx"
#include "TDF_TagSource.hxx"
#include "TDF_Data.hxx"

#include <cstdint>

namespace std
{
template <>
struct hash<TDF_Label>
{
  size_t operator()(const TDF_Label& theLabel) const noexcept
  {
    return static_cast<size_t>(reinterpret_cast<std::uintptr_t>(theLabel.myLabelNode));
  }
};
} // namespace std

inline TDF_Label::TDF_Label()
    : myLabelNode(nullptr)
{
}

inline TDF_Label::TDF_Label(const TDF_LabelNodePtr& aNode)
    : myLabelNode(aNode)
{
}

inline void TDF_Label::Nullify()
{
  myLabelNode = nullptr;
}

inline bool TDF_Label::IsRoot() const
{
  return myLabelNode->IsRoot();
}

inline bool TDF_Label::IsNull() const
{
  return (myLabelNode == nullptr);
}

inline bool TDF_Label::IsImported() const
{
  return myLabelNode->IsImported();
}

inline bool TDF_Label::IsEqual(const TDF_Label& aLabel) const
{
  return (myLabelNode == aLabel.myLabelNode);
}

inline bool TDF_Label::IsDifferent(const TDF_Label& aLabel) const
{
  return (myLabelNode != aLabel.myLabelNode);
}

inline int TDF_Label::Tag() const
{
  return myLabelNode->Tag();
}

inline const TDF_Label TDF_Label::Father() const
{
  return TDF_Label(myLabelNode->Father());
}

inline bool TDF_Label::HasChild() const
{
  return (myLabelNode->FirstChild() != nullptr);
}

inline bool TDF_Label::AttributesModified() const
{
  return myLabelNode->AttributesModified();
}

inline bool TDF_Label::MayBeModified() const
{
  return myLabelNode->MayBeModified();
}

inline occ::handle<TDF_Data> TDF_Label::Data() const
{
  return myLabelNode->Data();
}

inline Standard_OStream& operator<<(Standard_OStream& anOS, const TDF_Label& aLab)
{
  aLab.Dump(anOS);
  return anOS;
}

inline TDF_Label TDF_Label::NewChild() const
{
  return TDF_TagSource::NewChild(*this);
}
