blob: e2c11a545c75e4753d78ba3b83c5c49a856f8ccf [file] [log] [blame]
------------------------------------------------------------------------------
-- --
-- GNAT RUN-TIME COMPONENTS --
-- --
-- G N A T . C P P . S T D . T Y P E _ I N F O --
-- --
-- S p e c --
-- --
-- Copyright (C) 2022-2025, AdaCore --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. --
-- --
-- As a special exception under Section 7 of GPL version 3, you are granted --
-- additional permissions described in the GCC Runtime Library Exception, --
-- version 3.1, as published by the Free Software Foundation. --
-- --
-- You should have received a copy of the GNU General Public License and --
-- a copy of the GCC Runtime Library Exception along with this program; --
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
-- <http://www.gnu.org/licenses/>. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
-- This package provides an interface to C++'s std::type_info objects
with System;
with Interfaces.C;
with Interfaces.C.Extensions;
with Interfaces.C.Strings;
-- This unit should be kept private. We can't run constructors
-- (they're inline), and destructors have to be declared before the
-- public methods because of their position in the virtual method
-- table, so they have to be public as well. It would be unsafe to
-- run them, since std::type_info objects are typically
-- statically-allocated. Without out-of-line constructors, deriving
-- from this type would be a challenge. However, there are some
-- select APIs that we wish to use for exception handling machinery,
-- and others that could be potentially useful in Ada/C++ programs,
-- that are exposed in GNAT.CPP.Std.
private package GNAT.CPP.Std.Type_Info is
type type_info is abstract tagged limited private;
pragma Import (CPP, type_info);
pragma Warnings (Off, "CPP constructor required for type");
-- Defined inline, no out-of-line version available.
-- function Constructor (name : Interfaces.C.Strings.chars_ptr)
-- return type_info is abstract;
-- pragma Cpp_Constructor (Constructor, "_ZNSt9type_infoC1EPKc");
-- Allowing destruction is undesirable, but since these are in
-- the virtual method table, we have to declare them.
-- ??? Could we make them private somehow?
procedure Destructor (this : access type_info);
pragma Import (CPP, Destructor, "_ZNSt9type_infoD1Ev");
pragma Machine_Attribute (Destructor, "nothrow");
procedure Delete_Destructor (This : access type_info);
pragma Import (CPP, Delete_Destructor, "_ZNSt9type_InfoD0Ev");
pragma Machine_Attribute (Delete_Destructor, "nothrow");
-- Defined inline, no out-of-line version available.
-- Reimplemented in Ada, using Ada types.
function Name (this : access constant type_info'Class)
-- return Interfaces.C.Strings.chars_ptr;
return Interfaces.C.Strings.chars_ptr;
-- pragma Import (CPP, Name, "_ZNKSt9type_info4nameEv");
pragma Machine_Attribute (Name, "nothrow");
-- Defined inline, no out-of-line version available.
-- Reimplemented in Ada, using Ada types.
function Before (this, that : access constant type_info'Class)
-- return Interfaces.C.Extensions.bool;
return Boolean;
-- pragma Import (CPP, Before, "_ZNKSt9type_info6beforeERKS_");
pragma Machine_Attribute (Before, "nothrow");
-- Defined inline, no out-of-line version available.
-- Reimplemented in Ada, with an Ada interface.
function Equals (this, that : access constant type_info'Class)
-- return Interfaces.C.Extensions.bool;
return Boolean;
-- pragma Import (CPP, Equals, "_ZNKSt9type_infoeqERKS_");
pragma Machine_Attribute (Equals, "nothrow");
-- function "/=" (this : access constant type_info'Class;
-- arg : access constant type_info'Class)
-- return Interfaces.C.Extensions.bool;
-- pragma Import (CPP, "/=", "_ZNKSt9type_infoneERKS_");
-- pragma Machine_Attribute ("/=", "nothrow");
-- Defined inline, no out-of-line version available.
-- function Hash_Code (this : access constant type_info'Class)
-- return Interfaces.C.size_t;
-- pragma Import (CPP, Hash_Code, "_ZNKSt9type_info9hash_codeEv");
-- pragma Machine_Attribute (Hash_Code, "nothrow");
function Is_Pointer_P (this : access constant type_info)
return Interfaces.C.Extensions.bool;
pragma Import (CPP, Is_Pointer_P,
"_ZNKSt9type_info14__is_pointer_pEv");
function Is_Function_P (this : access constant type_info)
return Interfaces.C.Extensions.bool;
pragma Import (CPP, Is_Function_P,
"_ZNKSt9type_info15__is_function_pEv");
function Do_Catch
(this : access constant type_info;
thrown_type : access constant type_info'Class;
thrown_object : in out System.Address;
outer_count : Interfaces.C.unsigned)
return Interfaces.C.Extensions.bool;
pragma Import (CPP, Do_Catch,
"_ZNKSt9type_info10__do_catchEPKS_PPvj");
function Do_Upcast
(this : access constant type_info;
target : access constant type_info'Class;
obj_ptr : in out System.Address)
return Interfaces.C.Extensions.bool;
pragma Import
(CPP, Do_Upcast,
"_ZNKSt9type_info11__do_upcastEPKN10"
& "__cxxabiv117__class_type_infoEPPv");
private
type type_info is abstract tagged limited record
Raw_Name : Interfaces.C.Strings.chars_ptr;
end record;
end GNAT.CPP.Std.Type_Info;