refactor code
This commit is contained in:
parent
cfed6ca160
commit
ebc22fe370
|
@ -10,18 +10,32 @@
|
|||
|
||||
namespace php_arma
|
||||
{
|
||||
template <typename... Ts>
|
||||
template <typename F, typename... Ts>
|
||||
zend_always_inline
|
||||
void const_declare(zend_class_entry *ce, Ts&&... constants)
|
||||
void const_declare(zend_class_entry *ce, F&& func, Ts&&... constants)
|
||||
{
|
||||
for (auto&& [name, val] : { constants... }) {
|
||||
zend_declare_class_constant_long(ce, name, strlen(name), val);
|
||||
func(ce, name, strlen(name), val);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
zend_always_inline
|
||||
void long_const_declare(zend_class_entry *ce, Ts&&... constants)
|
||||
{
|
||||
const_declare(ce, zend_declare_class_constant_long, std::forward<Ts>(constants)...);
|
||||
}
|
||||
|
||||
template <typename... Ts>
|
||||
zend_always_inline
|
||||
void bool_const_declare(zend_class_entry *ce, Ts&&... constants)
|
||||
{
|
||||
const_declare(ce, zend_declare_class_constant_bool, std::forward<Ts>(constants)...);
|
||||
}
|
||||
|
||||
void constants_init()
|
||||
{
|
||||
const_declare(fill_ce = abstract_class_register<fill_php_name>(),
|
||||
long_const_declare(fill_ce = abstract_class_register<fill_php_name>(),
|
||||
std::make_tuple("NONE", fill::none),
|
||||
std::make_tuple("ZEROS", fill::zeros),
|
||||
std::make_tuple("ONES", fill::ones),
|
||||
|
@ -29,7 +43,7 @@ namespace php_arma
|
|||
std::make_tuple("RANDU", fill::randu),
|
||||
std::make_tuple("RANDN", fill::randn)
|
||||
);
|
||||
const_declare(file_type_ce = abstract_class_register<file_type_php_name>(),
|
||||
long_const_declare(file_type_ce = abstract_class_register<file_type_php_name>(),
|
||||
std::make_tuple("AUTO_DETECT", file_type::auto_detect),
|
||||
std::make_tuple("ARMA_BINARY", file_type::arma_binary),
|
||||
std::make_tuple("ARMA_ASCII", file_type::arma_ascii),
|
||||
|
@ -40,23 +54,24 @@ namespace php_arma
|
|||
std::make_tuple("PGM_BINARY", file_type::pgm_binary),
|
||||
std::make_tuple("HDF5_BINARY", file_type::hdf5_binary)
|
||||
);
|
||||
const_declare(sort_direction_ce = abstract_class_register<sort_direction_php_name>(),
|
||||
long_const_declare(sort_direction_ce = abstract_class_register<sort_direction_php_name>(),
|
||||
std::make_tuple("ASCEND", sort_direction::ascend),
|
||||
std::make_tuple("DESCEND", sort_direction::descend),
|
||||
std::make_tuple("STRICT_ASCEND", sort_direction::strict_ascend),
|
||||
std::make_tuple("STRICT_DESCEND", sort_direction::strict_descend)
|
||||
);
|
||||
#ifdef ARMA_USE_HDF5
|
||||
const_declare(hdf5_opts_ce = abstract_class_register<hdf5_opts_php_name>(),
|
||||
long_const_declare(hdf5_opts_ce = abstract_class_register<hdf5_opts_php_name>(),
|
||||
std::make_tuple("NONE", hdf5_opts::none),
|
||||
std::make_tuple("TRANS", hdf5_opts::trans),
|
||||
std::make_tuple("APPEND", hdf5_opts::append),
|
||||
std::make_tuple("REPLACE", hdf5_opts::replace)
|
||||
);
|
||||
#endif // ARMA_USE_HDF5
|
||||
const_declare(features_ce = abstract_class_register<features_php_name>(),
|
||||
bool_const_declare(features_ce = abstract_class_register<features_php_name>(),
|
||||
std::make_tuple("OPERATORS", features::operators),
|
||||
std::make_tuple("HDF5", features::hdf5)
|
||||
std::make_tuple("HDF5", features::hdf5),
|
||||
std::make_tuple("STREAM_RES", features::stream_res)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -133,7 +133,7 @@ namespace php_arma
|
|||
static constexpr auto replace = 1u << 2;
|
||||
};
|
||||
|
||||
constexpr const char hdf5_opts_php_name[] = "HDF5Opts";
|
||||
constexpr const char hdf5_opts_php_name[] = "Hdf5Opts";
|
||||
inline zend_class_entry *hdf5_opts_ce;
|
||||
#endif // ARMA_USE_HDF5
|
||||
|
||||
|
@ -149,6 +149,11 @@ namespace php_arma
|
|||
#else
|
||||
static constexpr auto hdf5 = false;
|
||||
#endif // ARMA_USE_HDF5
|
||||
#if defined(__GNUC__) && !defined(__clang__)
|
||||
static constexpr auto stream_res = true;
|
||||
#else
|
||||
static constexpr auto stream_res = false;
|
||||
#endif
|
||||
};
|
||||
|
||||
constexpr const char features_php_name[] = "Features";
|
||||
|
|
|
@ -20,4 +20,9 @@ abstract class Features
|
|||
* Whether data can be saved into or loaded from files in HDF5 format.
|
||||
*/
|
||||
const HDF5 = true;
|
||||
|
||||
/**
|
||||
* Whether this extension supports PHP stream resource I/O.
|
||||
*/
|
||||
const STREAM_RES = true;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ namespace Arma;
|
|||
*
|
||||
* @package Arma
|
||||
*/
|
||||
abstract class HDF5Opts
|
||||
abstract class Hdf5Opts
|
||||
{
|
||||
/**
|
||||
* No extra options.
|
|
@ -156,7 +156,9 @@ interface Base extends Countable
|
|||
function hasNan();
|
||||
|
||||
/**
|
||||
* Print the contents of the object to a stream.
|
||||
* Print the contents of the object to a stream resource.
|
||||
*
|
||||
* Feature\STREAM_RES must be true if $stream is specified.
|
||||
*
|
||||
* @param resource $stream[optional]
|
||||
* @return void
|
||||
|
@ -165,6 +167,8 @@ interface Base extends Countable
|
|||
|
||||
/**
|
||||
* Similar to the print() member function, with the difference that no formatting of the output is done.
|
||||
*
|
||||
* Feature\STREAM_RES must be true if $stream is specified.
|
||||
*
|
||||
* @param resource $stream[optional]
|
||||
* @return void
|
||||
|
|
|
@ -55,7 +55,7 @@ interface Resizable
|
|||
// Saving/loading
|
||||
|
||||
/**
|
||||
* Store data in a file or stream (the stream must be opened in binary mode).
|
||||
* Store data in a file or stream resource (Feature\STREAM_RES must be true).
|
||||
*
|
||||
* Data will be saved to $dest, which can be the file name, stream handle, or (HDF5 only) an array which
|
||||
* specifies HDF5 names and options (['file_name' => string, 'dataset_name' => string, 'options' => int]).
|
||||
|
@ -67,7 +67,7 @@ interface Resizable
|
|||
function save($dest, $file_type = FileType::ARMA_BINARY);
|
||||
|
||||
/**
|
||||
* Retrieve data from a file or stream (the stream must be opened in binary mode).
|
||||
* Retrieve data from a file or stream resource (Feature\STREAM_RES must be true).
|
||||
*
|
||||
* Data will be read from $from, which can be the source file name, stream handle, or (HDF5 only)
|
||||
* an array which specifies HDF5 names and options.
|
||||
|
|
|
@ -11,7 +11,7 @@ is_php_arma_loaded();
|
|||
require_once 'includes/assert.php';
|
||||
|
||||
use Arma\ {
|
||||
Fill, FileType, SortDirection, HDF5Opts
|
||||
Fill, FileType, SortDirection, Hdf5Opts
|
||||
};
|
||||
|
||||
$fill = [Fill::NONE, Fill::ZEROS, Fill::ONES, Fill::EYE, Fill::RANDU, Fill::RANDN];
|
||||
|
@ -24,7 +24,7 @@ $sort_direction = [
|
|||
SortDirection::ASCEND, SortDirection::DESCEND,
|
||||
SortDirection::STRICT_ASCEND, SortDirection::STRICT_DESCEND
|
||||
];
|
||||
$hdf5_opts = [HDF5Opts::TRANS >> 0, HDF5Opts::APPEND >> 1, HDF5Opts::REPLACE >> 2];
|
||||
$hdf5_opts = [Hdf5Opts::TRANS >> 0, Hdf5Opts::APPEND >> 1, Hdf5Opts::REPLACE >> 2];
|
||||
|
||||
batch_assert('constants',
|
||||
[range(0, 5), $fill],
|
||||
|
|
|
@ -3,7 +3,10 @@ Test save/load for `Arma\Mat`.
|
|||
--SKIPIF--
|
||||
<?php
|
||||
require_once 'includes/loaded.php';
|
||||
is_php_arma_loaded();
|
||||
require_once 'includes/supports.php';
|
||||
if (is_php_arma_loaded()) {
|
||||
supports_stream_resource();
|
||||
}
|
||||
?>
|
||||
--ENV--
|
||||
TMP_FILE=/tmp/php_arma_test.tmp
|
||||
|
|
|
@ -3,6 +3,7 @@ Test save/load with HDF5 format for `Arma\Mat`.
|
|||
--SKIPIF--
|
||||
<?php
|
||||
require_once 'includes/loaded.php';
|
||||
require_once 'includes/supports.php';
|
||||
if (is_php_arma_loaded()) {
|
||||
supports_hdf5();
|
||||
}
|
||||
|
@ -19,7 +20,7 @@ $file_name = getenv('TMP_FILE');
|
|||
$hdf5_options = [
|
||||
'file_name' => $file_name,
|
||||
'dataset_name' => 'tmp_dataset',
|
||||
'options' => Arma\HDF5Opts::TRANS
|
||||
'options' => Arma\Hdf5Opts::TRANS
|
||||
];
|
||||
|
||||
$mat = Arma\IMat::init(3, 3, Arma\Fill::RANDN);
|
||||
|
|
|
@ -24,6 +24,15 @@ function supports_operator_overloading() {
|
|||
return arma_supports(Arma\Features::OPERATORS, 'operator overloading');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether I/O with PHP stream resource is supported.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
function supports_stream_resource() {
|
||||
return arma_supports(Arma\Features::STREAM_RES, 'stream resource');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether HDF5 data format is supported.
|
||||
*
|
||||
|
|
Reference in New Issue