mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
0e7bac9Fix include pathe5bb90fFix constness of Proxyac0142aUse template castef6e381Add missing Url.h include206e65cFix constness of operator[]695cc38Use template instantiation for friend declaration7b1e03aAdd BaseFromMember49bc04fMake List<>::Node not uncopyabled5954ffAdd Journal to UnitTest58da106Temporarily disable ServiceQueue dtor precondition assertsfe58c1aAdd missing #include2c02580Add PropertyStream for server state introspection24c2315Add ScopedWrapperContexta3845f5Add RelativeTime::value_type typedef7442932Fix missing PropertyStream membersed5a98fMore PropertyStream output for PeerFinderfcfa10dAdd PropertyStream3cf0729Tidy up AbstractHandler usage in HTTPClient55171f4Remove obsolete source files1311ca3Increase arity of SharedFunction67d807dAdd IPEndpoint::key_equalebf395eAdd ErrorCode and boost library2c3ead3Add ServiceQueue::wrap6c7f5d0Move many Thread related classes93e9d86Measure CPU utilization in ServiceQueueca47d72Move ServiceQueue, ThreadLocalValue, SpinLockc864e4dMove WaitableEventff305e6Add CPUMeter and ScopedTimeInterval01fd05cAdd RecursiveMutex, UnlockGuard, TryLockGuard5831a53Remove Journal from most Stoppable overridesb60a7f3Add Request and Response HTTP parsers44445ffRefactor net buffers classesac37c38Beast class refactor8b7056bFix eof on HTTP client get228b664Remove obsolete beast container classes1dfd655Use RelativeTime from startup in DeadlineTimerae22d5dAdd more methods to RelativeTimec67929eRemove unhandled exception catcher2472a90Add 64 bit output for MurmurHashf3d97c7Add RelativeTime::fromStartupb0b8660IPEndpoint better parsingae551cdAdd alternate form string parsing to IPEndpointd0a0dbfDon't break on Throw0e46762Add hasher functors for IPEndpointa1ec423Add Thread::stopThreadAsync4f7dca3Add compiler, stdlib, and platform skeleton to beast/config4394594Tidy up some use of Error for throwe5e0f52Journal console output improvementsf07515eAdd Stoppable prepare and start interfacesd37dd46Move RelativeTime to chrono, add ostream support3f6e7aaAdd console feature to Journalad0064aJournal option to write to Output window (MSVC)0b7574bAdd compilation test scriptcc05ce1Add ServiceQueuee132aabUse boost for functional when the config is set026b926Fix is_continuation for boost versionc807a4eFix invoked_type type reference2ff781bRemove LockFreeStack::size3acb474Add SharedData::ConstAccess7e4c834Add LockFreeStack::empty9c61a6dAdded AbstractHandler, WrapHandler. HTTPClient Fixes.94e40dcFix unittest, by removing recursive call.38bf408Fix nonstandard C++ extension in getNullSink1ef044dBuild fixesd5d3746Fix missing <cmath> include for Gentoo5f231d3Update copyright notice and licenses7b89bf6Add FixedArray, IntrusiveArray, Crypto5c5de57Reorganize beast modules and files9e18bb3Merge commit '43deaaa5cf0d0178a4a6c3cb69c02a2a9a43ec7d' as 'src/beast/beast/http/impl/http-parser'57703acFix BeforeBoost.h includefbc247bAdd Stoppable to beast56496d8IPEndpoint comparisons9d9c822Migrate some headers and general tidying1a3cddcAdd SharedArg and AsyncObject373ca9cAdd HTTPRequest and improvements to HTTPMessage parsing9534516Add some thread classes and fix SharedData with a simple mutex adapter755ab36Make CallQueue unit test runManualc0ca037Remove Beast version printing on startup7efb6a3Reorganize some MPL and Utility classes and files69c26a1Fix missing BeastConfig.h include in Net.cpp40aa552Disable Beast version printing in Ripple BeastConfig.h7b1352dAdd InterruptibleThread unit test68cf759ThreadWithCallQueue unit test adjustment6501deaIPEndpoint parsing and tidying72fc42bMove and add some template metaprogramming classes2a164f0Change filname capitalization (end)6a14f25Change filename capitalization92fd417Move integer types to beast/CStdInt.hebbd9ffMove TargetPlatform.h to beast/Config.h874b524Add IPEndpoint14b34fcTidy up some zlib macro undefines34fffcaRename beast sources for consistency4e59ab2Add CallQueue unit test327d7a6Fixes for consolidated beast unity includesd5ece4eRemove unused and broken classes39f13beRemove unused ConcurrentObject37624a7Add ThreadWithCallQueue unit teste82ec68Remove obsolete beast_Function90551a6Temporarily leave sqlite3 in whatever threading mode it was already in.43ebbb1Fix SharedSingleton to use memoryBarrierf343941Tidy up SharedSingleton doc comments001997eFix leak on exit from Singleton dependency cycle83b9d22Rename to DeadlineTimer::cancel()77874eeUse new instead of ::new for placement2a04dccJournal improvements50965caSharedFunction improvements277e32bAdd LockFreeStack iteratorsd94e4c2Fix undefined behavior in UnsignedIntegerCalc (again)2dc25ceFix DeadlineTimer, callback while holding lock207ffdeFix undefined behavior in UnsignedIntegerCalc1ad8ff9Fix UnsignedInteger::isZero1dd2836Add support for multiprecision integer arithmetic and binary data encodinga45fc47Update .gitignore962a95dTidy up UnsignedIntegerca695faAdd Time::isNull()e96ce99Better random number facilities in UnitTest550b8e5Fine tune UnsignedInteger declaration8e7e3b7Allow negative relative expirations in DeadlineTimerf3dc7ceAdd generic Journal class for loggingbfdda32Make ChildProcess UnitTest manual since it malfunctions02acf7dGeneral refactoring of beast framework classes84ef06eFix ExitHook to derive from AtExitHookf0acc9cReduce the max threads in the Workers unit test55447b0New SharedSingleton, resolves destruction of objects with static storage duration.41eb8a1Remove deprecated SharedPtr::getObject9eda4bcMake SharedObject members const, the counter mutable6eda777Remove deprecated createOnDemandOnce SingletonLifetime option8c522aaFix off by one in pending i/o count on HTTPClient057344eAdd HTTPMessage::toString and familyee728e3Add UniformResourceLocator::emptyae324fbMove ./modules to ./src git-subtree-dir: src/beast git-subtree-split:0e7bac945f
323 lines
12 KiB
C++
323 lines
12 KiB
C++
//------------------------------------------------------------------------------
|
|
/*
|
|
This file is part of Beast: https://github.com/vinniefalco/Beast
|
|
Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
|
|
|
|
Portions of this file are from JUCE.
|
|
Copyright (c) 2013 - Raw Material Software Ltd.
|
|
Please visit http://www.juce.com
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
copyright notice and this permission notice appear in all copies.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
//==============================================================================
|
|
|
|
#ifndef BEAST_BIGINTEGER_H_INCLUDED
|
|
#define BEAST_BIGINTEGER_H_INCLUDED
|
|
|
|
//==============================================================================
|
|
/**
|
|
An arbitrarily large integer class.
|
|
|
|
A BigInteger can be used in a similar way to a normal integer, but has no size
|
|
limit (except for memory and performance constraints).
|
|
|
|
Negative values are possible, but the value isn't stored as 2s-complement, so
|
|
be careful if you use negative values and look at the values of individual bits.
|
|
*/
|
|
class BEAST_API BigInteger : LeakChecked <BigInteger>
|
|
{
|
|
public:
|
|
//==============================================================================
|
|
/** Creates an empty BigInteger */
|
|
BigInteger();
|
|
|
|
/** Creates a BigInteger containing an integer value in its low bits.
|
|
The low 32 bits of the number are initialised with this value.
|
|
*/
|
|
BigInteger (uint32 value);
|
|
|
|
/** Creates a BigInteger containing an integer value in its low bits.
|
|
The low 32 bits of the number are initialised with the absolute value
|
|
passed in, and its sign is set to reflect the sign of the number.
|
|
*/
|
|
BigInteger (int32 value);
|
|
|
|
/** Creates a BigInteger containing an integer value in its low bits.
|
|
The low 64 bits of the number are initialised with the absolute value
|
|
passed in, and its sign is set to reflect the sign of the number.
|
|
*/
|
|
BigInteger (int64 value);
|
|
|
|
/** Creates a copy of another BigInteger. */
|
|
BigInteger (const BigInteger& other);
|
|
|
|
#if BEAST_COMPILER_SUPPORTS_MOVE_SEMANTICS
|
|
BigInteger (BigInteger&& other) noexcept;
|
|
BigInteger& operator= (BigInteger&& other) noexcept;
|
|
#endif
|
|
|
|
/** Destructor. */
|
|
~BigInteger();
|
|
|
|
//==============================================================================
|
|
/** Copies another BigInteger onto this one. */
|
|
BigInteger& operator= (const BigInteger& other);
|
|
|
|
/** Swaps the internal contents of this with another object. */
|
|
void swapWith (BigInteger& other) noexcept;
|
|
|
|
//==============================================================================
|
|
/** Returns the value of a specified bit in the number.
|
|
If the index is out-of-range, the result will be false.
|
|
*/
|
|
bool operator[] (int bit) const noexcept;
|
|
|
|
/** Returns true if no bits are set. */
|
|
bool isZero() const noexcept;
|
|
|
|
/** Returns true if the value is 1. */
|
|
bool isOne() const noexcept;
|
|
|
|
/** Attempts to get the lowest bits of the value as an integer.
|
|
If the value is bigger than the integer limits, this will return only the lower bits.
|
|
*/
|
|
int toInteger() const noexcept;
|
|
|
|
//==============================================================================
|
|
/** Resets the value to 0. */
|
|
void clear();
|
|
|
|
/** Clears a particular bit in the number. */
|
|
void clearBit (int bitNumber) noexcept;
|
|
|
|
/** Sets a specified bit to 1. */
|
|
void setBit (int bitNumber);
|
|
|
|
/** Sets or clears a specified bit. */
|
|
void setBit (int bitNumber, bool shouldBeSet);
|
|
|
|
/** Sets a range of bits to be either on or off.
|
|
|
|
@param startBit the first bit to change
|
|
@param numBits the number of bits to change
|
|
@param shouldBeSet whether to turn these bits on or off
|
|
*/
|
|
void setRange (int startBit, int numBits, bool shouldBeSet);
|
|
|
|
/** Inserts a bit an a given position, shifting up any bits above it. */
|
|
void insertBit (int bitNumber, bool shouldBeSet);
|
|
|
|
/** Returns a range of bits as a new BigInteger.
|
|
|
|
e.g. getBitRangeAsInt (0, 64) would return the lowest 64 bits.
|
|
@see getBitRangeAsInt
|
|
*/
|
|
BigInteger getBitRange (int startBit, int numBits) const;
|
|
|
|
/** Returns a range of bits as an integer value.
|
|
|
|
e.g. getBitRangeAsInt (0, 32) would return the lowest 32 bits.
|
|
|
|
Asking for more than 32 bits isn't allowed (obviously) - for that, use
|
|
getBitRange().
|
|
*/
|
|
uint32 getBitRangeAsInt (int startBit, int numBits) const noexcept;
|
|
|
|
/** Sets a range of bits to an integer value.
|
|
|
|
Copies the given integer onto a range of bits, starting at startBit,
|
|
and using up to numBits of the available bits.
|
|
*/
|
|
void setBitRangeAsInt (int startBit, int numBits, uint32 valueToSet);
|
|
|
|
/** Shifts a section of bits left or right.
|
|
|
|
@param howManyBitsLeft how far to move the bits (+ve numbers shift it left, -ve numbers shift it right).
|
|
@param startBit the first bit to affect - if this is > 0, only bits above that index will be affected.
|
|
*/
|
|
void shiftBits (int howManyBitsLeft, int startBit);
|
|
|
|
/** Returns the total number of set bits in the value. */
|
|
int countNumberOfSetBits() const noexcept;
|
|
|
|
/** Looks for the index of the next set bit after a given starting point.
|
|
|
|
This searches from startIndex (inclusive) upwards for the first set bit,
|
|
and returns its index. If no set bits are found, it returns -1.
|
|
*/
|
|
int findNextSetBit (int startIndex) const noexcept;
|
|
|
|
/** Looks for the index of the next clear bit after a given starting point.
|
|
|
|
This searches from startIndex (inclusive) upwards for the first clear bit,
|
|
and returns its index.
|
|
*/
|
|
int findNextClearBit (int startIndex) const noexcept;
|
|
|
|
/** Returns the index of the highest set bit in the number.
|
|
If the value is zero, this will return -1.
|
|
*/
|
|
int getHighestBit() const noexcept;
|
|
|
|
//==============================================================================
|
|
// All the standard arithmetic ops...
|
|
|
|
BigInteger& operator+= (const BigInteger& other);
|
|
BigInteger& operator-= (const BigInteger& other);
|
|
BigInteger& operator*= (const BigInteger& other);
|
|
BigInteger& operator/= (const BigInteger& other);
|
|
BigInteger& operator|= (const BigInteger& other);
|
|
BigInteger& operator&= (const BigInteger& other);
|
|
BigInteger& operator^= (const BigInteger& other);
|
|
BigInteger& operator%= (const BigInteger& other);
|
|
BigInteger& operator<<= (int numBitsToShift);
|
|
BigInteger& operator>>= (int numBitsToShift);
|
|
BigInteger& operator++();
|
|
BigInteger& operator--();
|
|
BigInteger operator++ (int);
|
|
BigInteger operator-- (int);
|
|
|
|
BigInteger operator-() const;
|
|
BigInteger operator+ (const BigInteger& other) const;
|
|
BigInteger operator- (const BigInteger& other) const;
|
|
BigInteger operator* (const BigInteger& other) const;
|
|
BigInteger operator/ (const BigInteger& other) const;
|
|
BigInteger operator| (const BigInteger& other) const;
|
|
BigInteger operator& (const BigInteger& other) const;
|
|
BigInteger operator^ (const BigInteger& other) const;
|
|
BigInteger operator% (const BigInteger& other) const;
|
|
BigInteger operator<< (int numBitsToShift) const;
|
|
BigInteger operator>> (int numBitsToShift) const;
|
|
|
|
bool operator== (const BigInteger& other) const noexcept;
|
|
bool operator!= (const BigInteger& other) const noexcept;
|
|
bool operator< (const BigInteger& other) const noexcept;
|
|
bool operator<= (const BigInteger& other) const noexcept;
|
|
bool operator> (const BigInteger& other) const noexcept;
|
|
bool operator>= (const BigInteger& other) const noexcept;
|
|
|
|
//==============================================================================
|
|
/** Does a signed comparison of two BigIntegers.
|
|
|
|
Return values are:
|
|
- 0 if the numbers are the same
|
|
- < 0 if this number is smaller than the other
|
|
- > 0 if this number is bigger than the other
|
|
*/
|
|
int compare (const BigInteger& other) const noexcept;
|
|
|
|
/** Compares the magnitudes of two BigIntegers, ignoring their signs.
|
|
|
|
Return values are:
|
|
- 0 if the numbers are the same
|
|
- < 0 if this number is smaller than the other
|
|
- > 0 if this number is bigger than the other
|
|
*/
|
|
int compareAbsolute (const BigInteger& other) const noexcept;
|
|
|
|
/** Divides this value by another one and returns the remainder.
|
|
|
|
This number is divided by other, leaving the quotient in this number,
|
|
with the remainder being copied to the other BigInteger passed in.
|
|
*/
|
|
void divideBy (const BigInteger& divisor, BigInteger& remainder);
|
|
|
|
/** Returns the largest value that will divide both this value and the one passed-in.
|
|
*/
|
|
BigInteger findGreatestCommonDivisor (BigInteger other) const;
|
|
|
|
/** Performs a combined exponent and modulo operation.
|
|
This BigInteger's value becomes (this ^ exponent) % modulus.
|
|
*/
|
|
void exponentModulo (const BigInteger& exponent, const BigInteger& modulus);
|
|
|
|
/** Performs an inverse modulo on the value.
|
|
i.e. the result is (this ^ -1) mod (modulus).
|
|
*/
|
|
void inverseModulo (const BigInteger& modulus);
|
|
|
|
//==============================================================================
|
|
/** Returns true if the value is less than zero.
|
|
@see setNegative, negate
|
|
*/
|
|
bool isNegative() const noexcept;
|
|
|
|
/** Changes the sign of the number to be positive or negative.
|
|
@see isNegative, negate
|
|
*/
|
|
void setNegative (bool shouldBeNegative) noexcept;
|
|
|
|
/** Inverts the sign of the number.
|
|
@see isNegative, setNegative
|
|
*/
|
|
void negate() noexcept;
|
|
|
|
//==============================================================================
|
|
/** Converts the number to a string.
|
|
|
|
Specify a base such as 2 (binary), 8 (octal), 10 (decimal), 16 (hex).
|
|
If minimumNumCharacters is greater than 0, the returned string will be
|
|
padded with leading zeros to reach at least that length.
|
|
*/
|
|
String toString (int base, int minimumNumCharacters = 1) const;
|
|
|
|
/** Reads the numeric value from a string.
|
|
|
|
Specify a base such as 2 (binary), 8 (octal), 10 (decimal), 16 (hex).
|
|
Any invalid characters will be ignored.
|
|
*/
|
|
void parseString (const String& text, int base);
|
|
|
|
//==============================================================================
|
|
/** Turns the number into a block of binary data.
|
|
|
|
The data is arranged as little-endian, so the first byte of data is the low 8 bits
|
|
of the number, and so on.
|
|
|
|
@see loadFromMemoryBlock
|
|
*/
|
|
MemoryBlock toMemoryBlock() const;
|
|
|
|
/** Converts a block of raw data into a number.
|
|
|
|
The data is arranged as little-endian, so the first byte of data is the low 8 bits
|
|
of the number, and so on.
|
|
|
|
@see toMemoryBlock
|
|
*/
|
|
void loadFromMemoryBlock (const MemoryBlock& data);
|
|
|
|
private:
|
|
//==============================================================================
|
|
HeapBlock <uint32> values;
|
|
size_t numValues;
|
|
int highestBit;
|
|
bool negative;
|
|
|
|
void ensureSize (size_t numVals);
|
|
void shiftLeft (int bits, int startBit);
|
|
void shiftRight (int bits, int startBit);
|
|
};
|
|
|
|
/** Writes a BigInteger to an OutputStream as a UTF8 decimal string. */
|
|
OutputStream& BEAST_CALLTYPE operator<< (OutputStream& stream, const BigInteger& value);
|
|
|
|
//==============================================================================
|
|
#ifndef DOXYGEN
|
|
// For backwards compatibility, BitArray is defined as an alias for BigInteger.
|
|
typedef BigInteger BitArray;
|
|
#endif
|
|
|
|
|
|
#endif // BEAST_BIGINTEGER_H_INCLUDED
|