File indexing completed on 2024-05-12 17:21:04

0001 /*
0002  * SPDX-FileCopyrightText: 2021-2022 Rohan Asokan <rohan.asokan@students.iiit.ac.in>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 #include "knumber_binary_wrapper.h"
0007 #include "knumber.h"
0008 #include <QString>
0009 #include <QRegularExpression>
0010 #include <QLatin1String>
0011 #include <QDebug>
0012 
0013 // Constructors and Destructors
0014 
0015 BinaryNumber::BinaryNumber(const BinaryNumber& other) {
0016     m_number = other.toKNum();
0017 }
0018 
0019 BinaryNumber::BinaryNumber(const KNumber &num) {
0020     m_number = num;
0021 }
0022 
0023 BinaryNumber::BinaryNumber(const QString &s) : m_number(KNumber("UNDEFINED_ERROR")) {
0024     const QRegularExpression binary_regex("^[01]+.[01]+|^[01]+");
0025 
0026     if (binary_regex.match(s).hasMatch()) {
0027         m_number = KNumber(0);
0028         int seperator_loc = s.indexOf('.');
0029         if (seperator_loc == -1) seperator_loc = s.length();
0030 
0031         KNumber multiplier(1);
0032         KNumber base(2);
0033 
0034         // Integer Part Calculations
0035         for (int idx = seperator_loc - 1; idx >= 0; idx--) {
0036             m_number += (KNumber(s.at(idx)) * multiplier);
0037             multiplier *= base;
0038         }
0039 
0040         // multiplier = base;
0041         // // Fractional Part Calculations
0042         // for (int idx = seperator_loc + 1; idx < s.length(); idx++) {
0043         //     m_number += (KNumber(s.at(idx)) / base);
0044         //     multiplier *= base;
0045         // }
0046     }
0047 }
0048 
0049 // Converters
0050 
0051 QString BinaryNumber::toDec() const {
0052     return m_number.toQString();
0053 }
0054 
0055 KNumber BinaryNumber::toKNum() const {
0056     return m_number;
0057 }
0058 
0059 // Operators
0060 
0061 BinaryNumber &BinaryNumber::operator=(const BinaryNumber &rhs) {
0062     (*this).m_number = rhs.toKNum();
0063     return *this;
0064 }
0065 
0066 BinaryNumber operator+(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0067     KNumber res(lhs.toKNum());
0068     res += rhs.toKNum();
0069     return BinaryNumber(res);
0070 }
0071 
0072 BinaryNumber operator-(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0073     KNumber res(lhs.toKNum());
0074     res -= rhs.toKNum();
0075     return BinaryNumber(res);
0076 }
0077 
0078 BinaryNumber operator*(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0079     KNumber res(lhs.toKNum());
0080     res *= rhs.toKNum();
0081     return BinaryNumber(res);
0082 }
0083 
0084 BinaryNumber operator/(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0085     KNumber res(lhs.toKNum());
0086     res /= rhs.toKNum();
0087     return BinaryNumber(res);
0088 }
0089 
0090 BinaryNumber operator&(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0091     KNumber res(lhs.toKNum());
0092     res &= rhs.toKNum();
0093     return BinaryNumber(res);
0094 }
0095 
0096 BinaryNumber operator|(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0097     KNumber res(lhs.toKNum());
0098     res |= rhs.toKNum();
0099     return BinaryNumber(res);
0100 }
0101 
0102 BinaryNumber operator^(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0103     KNumber res(lhs.toKNum());
0104     res ^= rhs.toKNum();
0105     return BinaryNumber(res);
0106 }
0107 
0108 BinaryNumber operator<<(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0109     KNumber res(lhs.toKNum());
0110     res <<= rhs.toKNum();
0111     return BinaryNumber(res);
0112 }
0113 
0114 BinaryNumber operator>>(const BinaryNumber &lhs, const BinaryNumber &rhs) {
0115     KNumber res(lhs.toKNum());
0116     res >>= rhs.toKNum();
0117     return BinaryNumber(res);
0118 }