// Copyright (C) 2011 The Android Open Source Project
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. Neither the name of the project nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
// SUCH DAMAGE.
//
// class_type_info.cc: Methods for __class_type_info.

#include <cxxabi.h>

namespace __cxxabiv1
{
  __class_type_info::~__class_type_info()
  {
  }

  bool __class_type_info::can_catch(const std::type_info* thrown_type,
                                    void*& adjustedPtr) const {
    if (*this == *thrown_type) {
      return true;
    }

    const __class_type_info* thrown_class_type =
      dynamic_cast<const __class_type_info*>(thrown_type);
    if (thrown_class_type == 0) {
      return false;
    }

    __UpcastInfo info(this);
    thrown_class_type->walk_to(this, adjustedPtr, info);

    if (info.status != __UpcastInfo::has_public_contained) {
      return false;
    }

    adjustedPtr = info.adjustedPtr;
    return true;
  }

  bool __class_type_info::walk_to(const __class_type_info* base_type,
                                  void*& adjustedPtr,
                                  __UpcastInfo& info) const {
    return self_class_type_match(base_type, adjustedPtr, info);
  }

  bool __class_type_info::self_class_type_match(const __class_type_info* base_type,
                                                void*& adjustedPtr,
                                                __UpcastInfo& info) const {
    if (*this == *base_type) {
      info.status = __UpcastInfo::has_public_contained;
      info.base_type = base_type;
      info.adjustedPtr = adjustedPtr;
      info.nullobj_may_conflict = true;
      return true;
    }

    return false;
  }


  __UpcastInfo::__UpcastInfo(const __class_type_info* type)
    : status(unknown), base_type(0), adjustedPtr(0),
      premier_flags(0), nullobj_may_conflict(true) {
    // Keep the shape information for future use.
    if (const __vmi_class_type_info* p =
           dynamic_cast<const __vmi_class_type_info*>(type)) {
      premier_flags = p->__flags;
    }
  }
} // namespace __cxxabiv1
