/* $Id: t_bdCPP.c $ */

/*
* Copyright (C) 2001-26 David Ireland, D.I. Management Services Pty Limited
* <https://di-mgt.com.au/contact/> <https://di-mgt.com.au/bigdigits.html>
* SPDX-License-Identifier: MPL-2.0
*
* Last updated:
* $Date: 2026-03-29 05:11:00 $
* $Revision: 2.7.0 $
* $Author: dai $
*/

/* Using bigdigits in a C++ program. 
This file `t_bdCPP.cpp` and all other C++ modules should be compiled as C++ code (/TC in MSVC),
but supporting files (bigd.c, bigdigits.c) must be compiled as C code.
Do *not* change the extensions of the core source code files to `.cpp`.

With MSVC this works if you leave Properties >
    Configuration Properties > C/C++ > Advanced > Compile As > Default

To compile with gcc use
    g++ -std=c++11 -o t_bdCPP t_bdCPP.cpp bigdigits.o bigd.o bigdigitsRand.o bigdRand.o
having compiled `bigd.c`, `bigdigits.c`, etc. as C files earlier
    gcc -c bigdigits.c bigd.c bigdigitsRand.c bigdRand.c
*/

#include "bigd.h"
#include "bigdRand.h"

#include <iostream>
using namespace std;
int main()
{
    int ver;
    ver = bdVersion();
    cout << "bdVersion = " << ver << "\n";

    BIGD u, v, w;

    /* Create new BIGD objects */
    u = bdNew();
    v = bdNew();
    w = bdNew();

    /* Compute 2 * 0xdeadbeefface */
    bdSetShort(u, 2);
    bdConvFromHex(v, "deadbeefface");
    bdMultiply(w, u, v);

    /* Display the result */
    bdPrintHex("", u, " * ");
    bdPrintHex("0x", v, " = ");
    bdPrintHex("0x", w, "\n");
    /* and again in decimal format */
    bdPrintDecimal("", u, " * ");
    bdPrintDecimal("", v, " = ");
    bdPrintDecimal("", w, "\n");


    /* Add with digit overflow */
    /* ffffffff+ffffffff=00000001 fffffffe */
    bdSetShort(u, 0xffffffff);
    bdSetShort(v, 0xffffffff);
    bdAdd(w, u, v);
    bdPrintHex("", u, "+");
    bdPrintHex("", v, "=");
    bdPrintHex("", w, "\n");

    /* Generate some random digits using internal RNG */
    cout << "Some random numbers:\n";
    bdSetShort(u, bdRandDigit());
    bdPrintHex("short: ", u, "\n");
    bdRandomBits(u, 512);
    bdPrintHex("512 bits: ", u, "\n");

    /* Free all objects we made */
    bdFree(&u);
    bdFree(&v);
    bdFree(&w);

    return 0;
}