package foreign.tester;

import nova.Machine;
import nova.Store;
import nova.runtime;
import nova.special;

import java.util.HashMap;

/**
 * Warranty & Liability
 * To the extent permitted by applicable law and unless explicitly
 * otherwise agreed upon, XLOG Technologies AG makes no warranties
 * regarding the provided information. XLOG Technologies AG assumes
 * no liability that any problems might be solved with the information
 * provided by XLOG Technologies AG.
 *
 * Rights & License
 * All industrial property rights regarding the information - copyright
 * and patent rights in particular - are the sole property of XLOG
 * Technologies AG. If the company was not the originator of some
 * excerpts, XLOG Technologies AG has at least obtained the right to
 * reproduce, change and translate the information.
 *
 * Reproduction is restricted to the whole unaltered document. Reproduction
 * of the information is only allowed for non-commercial uses. Selling,
 * giving away or letting of the execution of the library is prohibited.
 * The library can be distributed as part of your applications and libraries
 * for execution provided this comment remains unchanged.
 *
 * Restrictions
 * Only to be distributed with programs that add significant and primary
 * functionality to the library. Not to be distributed with additional
 * software intended to replace any components of the library.
 *
 * Trademarks
 * Jekejeke is a registered trademark of XLOG Technologies AG.
 */
public final class statlib {

    /****************************************************************/
    /* sys_stat_map/1                                               */
    /****************************************************************/

    /**
     * sys_stat_map(M): internal only
     * The built-in succeeds in W with the statistics map.
     */
    private static boolean test_sys_stat_map(Object[] args) {
        HashMap res = new HashMap();
        res.put("wall", special.norm_smallint(System.currentTimeMillis()));
        res.put("time", Double.valueOf(Machine.real_time()));
        res.put("maxinfs", special.norm_smallint(Machine.gc_maxinfs));
        res.put("calls", special.norm_smallint(Machine.gc_enter));
        res.put("gctime", Double.valueOf(Machine.gc_time));
        res.put("used", special.norm_smallint(Runtime.getRuntime().totalMemory() -
                Runtime.getRuntime().freeMemory()));
        return Machine.exec_unify(args[0], res);
    }

    /**
     * garbage_collect: internal only
     * The built-in succeeds in attempting a garbage colection.
     */
    private static boolean test_garbage_collect(Object[] args) {
        Machine.gc_major();
        Runtime.getRuntime().gc();
        return true;
    }

    /******************************************************************/
    /* Stat Lib Init                                                  */
    /******************************************************************/

    public static void main() {
        Store.add("sys_stat_map", 1, special.make_check(statlib::test_sys_stat_map));
        Store.add("garbage_collect", 0, special.make_check(statlib::test_garbage_collect));
    }

}
