// Copyright 2018 POA Networks Ltd.
//
// 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.

#[macro_use]
extern crate criterion;

use classgroup::gmp::mpz::Mpz;
use classgroup::{gmp_classgroup::GmpClassGroup, ClassGroup};
use criterion::Criterion;
use std::str::FromStr;

fn bench_square(c: &mut Criterion) {
    for _ in 0..2 {
        let m_2048 = -Mpz::from_str(
            "201493927071865251625903550712920535753645598483515670853547009\
             878440933309489362800393797428711071833308081461824159206915864\
             150805748296170245037221957772328044276705571745811271212292422\
             075849739248257870371300001313586036515879618764093772248760562\
             386804073478433157526816295216137723803793411828867470089409596\
             238958950007370719325959579892866588928887249912429688364409867\
             895510817680171869190054122881274299350947669820596157115994418\
             034091728887584373727555384075665624624856766441009974642693066\
             751400054217209981490667208950669417773785631693879782993019167\
             69407006303085854796535778826115224633447713584423",
        )
        .unwrap();

        let m_1024 = -Mpz::from_str(
            "-11208471744389096429663063172516742066731683613191418514476174383781\
             682509882427394963852743081347678693241523614532942268295868231081182\
             819214054220080323345750407342623884342617809879459211722505867733607\
             400509994975706778681543998242335468203860240586171413971485860382901\
             6409314686266660248501773529803183",
        )
        .unwrap();
        let group_1024 = GmpClassGroup::generator_for_discriminant(m_1024);
        let group_2048 = GmpClassGroup::generator_for_discriminant(m_2048);
        let (group_1024_clone, group_2048_clone) = (group_1024.clone(), group_2048.clone());
        c.bench_function("square 1024", move |b| {
            b.iter(|| group_1024_clone.clone().square())
        });
        c.bench_function("multiply 1024", move |b| {
            b.iter(|| &group_1024 * &group_1024)
        });
        c.bench_function("square 2048", move |b| {
            b.iter(|| group_2048_clone.clone().square())
        });
        c.bench_function("multiply 2048", move |b| {
            b.iter(|| &group_2048 * &group_2048)
        });
    }
}

criterion_group!(benches, bench_square);
criterion_main!(benches);
