/*
Ousía
Copyright (C) 2014, 2015 Benjamin Paaßen, Andreas Stöckel
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
/**
* @file Number.hpp
*
* Contains the Number class responsible for parsing integers and doubles of
* various bases.
*
* @author Andreas Stöckel (astoecke@techfak.uni-bielefeld.de)
*/
#include
#include
#include
namespace ousia {
// Forward declarations
class CharReader;
class Logger;
/* Class Number */
/**
* Class used internally to represent a number (integer or double). The number
* is represented by its components (base value a, nominator n, denominator d,
* exponent e, sign s and exponent sign sE).
*/
class Number {
private:
/**
* Represents the part of the number: Base value a, nominator n, exponent e.
*/
enum class Part { A, N, E };
/**
* Sign of the number and the exponent.
*/
int8_t s, sE;
/**
* Exponent.
*/
int16_t e;
/**
* Base value, nominator, denominator
*/
int64_t a, n, d;
/**
* Variable specifying whether the parsed number actually was an integer.
*/
bool validInteger;
/**
* Appends the value of the character c to the internal number
* representation and reports any errors that might occur.
*
* @param c is the character that should be appended.
* @param base is the current base.
* @param p is the current number part.
* @param reader is the char reader which points at the current reading
* position.
*/
bool appendChar(char c, int base, Part p, CharReader &reader,
Logger &logger);
public:
/**
* Constructor of the number class.
*/
Number() : s(1), sE(1), e(0), a(0), n(0), d(1), validInteger(true) {}
/**
* Returns the represented double value.
*
* @return the double value the number is currently representing.
*/
double doubleValue();
/**
* Returns the represented integer value. Only a lossless operation, if the
* number is an integer (as can be checked via the isInt method), otherwise
* the exponent and the fractional value will be truncated.
*
* @return the integer value (ignoring any exponent)
*/
int64_t intValue();
/**
* Returns true, if the number was a valid integer.
*
* @return true if the number is an integer, false otherwise.
*/
bool isInt() { return validInteger; }
/**
* Tries to parse the number from the given stream and loggs any errors to
* the given logger instance. Numbers are terminated by one of the given
* delimiters.
*
* @param reader is the char reader from which the number should be read.
* @param logger is the logger instance to which error messages should be
* written.
* @param delims is a set of characters at which parsing should stop. The
* reader is positioned at the delimiter.
* @return true if parsing was successful, false otherwise.
*/
bool parse(
CharReader &reader, Logger &logger,
const std::unordered_set &delims = std::unordered_set{});
/**
* Tries to parse the number from the given string and loggs any errors to
* the given logger instance.
*
* @param str is the string from which the number should be read.
* @param logger is the logger instance to which error messages should be
* written.
* @return true if parsing was successful, false otherwise.
*/
bool parse(const std::string &str, Logger &logger);
/**
* Parses an integer with a fixed length and the given base.
*
* @param reader is a reference at the char reader from which the number
* should be read.
* @param len is the length of the integer sequence.
* @param base is the base of the number.
* @param logger is the logger instance to which error messages should be
* written.
* @return true if parsing was successful, false otherwise.
*/
bool parseFixedLengthInteger(CharReader &reader, int len, int base,
Logger &logger);
};
}