<?php

// Functions declared in this file can't be called normally.
// It's a compile-time error to use such function inside KPHP program.
// Only KPHP compiler can insert calls to these functions.

function _exception_set_location($e, string $filename, int $line): ^1;

// access fields and methods by class name stored in variable, e.g. `new $class_name` and `$class_name::something`
// in gentree, such constructions are represented as func calls `_by_name_*($class_name, ...)`
// they can be used in generics if $class_name is class-string<T>, replaced by `_by_name_*('T', ...)` on instantiation
// later, such calls are replaced to `new T` and `T::something`, or produce a compilation error if left as variable
// note, that `_by_name(...) += 5` is valid, since it's replaced to `T::$field += 5` long before rl calc
// see GenTree::get_member_by_name_after_var() and replace-extern-func-calls.cpp

// `new $c(...)` => `_by_name_construct($c, ...)`
function _by_name_construct(string $class_name, ...$args) ::: instance<^1>;
// `$c::method()` => `_by_name_call_method($c, 'method')`
function _by_name_call_method(string $class_name, string $method_name, ...$args);
// `$c::CONST` => `_by_name_get_const($c, 'CONST')`
function _by_name_get_const(string $class_name, string $constant);
// `$c::$field` => `_by_name_get_field($c, 'field')`
function _by_name_get_field(string $class_name, string $field);

// microtime(false) specialization
function _microtime_string(): string;
// microtime(true) specialization
function _microtime_float(): float;

// hrtime(true) specialization
function _hrtime_int(): int;
// hrtime(false) specialization
function _hrtime_array(): int[];

/** @kphp-internal-result-indexing */
function _explode_nth($delimiter ::: string, $str ::: string, int $index): string;

/** @kphp-internal-result-indexing */
function _explode_1($delimiter ::: string, $str ::: string): string;

/** @kphp-internal-result-array2tuple */
function _explode_tuple2($delimiter ::: string, $str ::: string, int $mask, $limit ::: int = 2+1): tuple(string, string);
/** @kphp-internal-result-array2tuple */
function _explode_tuple3($delimiter ::: string, $str ::: string, int $mask, $limit ::: int = 3+1): tuple(string, string, string);
/** @kphp-internal-result-array2tuple */
function _explode_tuple4($delimiter ::: string, $str ::: string, int $mask, $limit ::: int = 4+1): tuple(string, string, string, string);

/** @kphp-internal-param-readonly $str */
function _tmp_substr($str ::: string, $start ::: int, $length ::: int = PHP_INT_MAX): _tmp_string;

/** @kphp-internal-param-readonly $str */
function _tmp_trim($str ::: string, $what ::: string = " \n\r\t\v\0"): _tmp_string;
