#  Copyright 2020 Modelling, Simulation and Design Lab (MSDL) at
#  McGill University and the University of Antwerp (http://msdl.cs.mcgill.ca/)
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

# TestU01 Wrapper for C libraries
# Compile TestU01 as explained in its README before using this file!
# TODO: platform independent!

from ctypes import *
from pypdevsbbl.extra.rngstreams import RngStream
import time

TestU01 = CDLL("libtestu01.so")


class unif01_Gen(Structure):
	_fields_ = [
		('state', c_void_p),
		('param', c_void_p),
		('name', c_char_p),
		('GetU01', CFUNCTYPE(POINTER(c_double), c_void_p, c_void_p)),
		('GetBits', CFUNCTYPE(POINTER(c_ulong), c_void_p, c_void_p)),
		('Write', CFUNCTYPE(c_void_p, c_void_p))
	]


rng = RngStream.RngStream_CreateStream("rng")
@CFUNCTYPE(c_uint)
def create():
	global rng
	return RngStream.RngStream_RandInt(rng, 1, 2**10) # TODO: intervals?

if __name__ == '__main__':
	# Testing
	gen1 = TestU01.unif01_CreateExternGenBits(b"RngStreams", create)
	begin = time.time()
	TestU01.bbattery_SmallCrush(gen1)
	end = time.time()
	print("DURATION:", end - begin)
	
	

