Files
cw_tree/src/numerics.hpp
Aryadev Chavali 139f2e9e5a Rework node constructor and general procedure API
Node constructor is now completely default constructed i.e. no
constructor arguments required.  The iterate function takes the queue
by reference, so it can update the caller's state.

Finally, to_string for a Node now uses the node allocator and an index
to print out trees.  Seems simpler and more in line with the current
implementation.
2024-07-26 02:55:58 +01:00

62 lines
1.5 KiB
C++

/* Copyright (C) 2024 Aryadev Chavali
* 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 Version 2 for
* details.
* You may distribute and modify this code under the terms of the GNU General
* Public License Version 2, which you should have received a copy of along with
* this program. If not, please go to <https://www.gnu.org/licenses/>.
* Created: 2024-07-26
* Author: Aryadev Chavali
* Description: Computation necessary for generating the tree
*/
#ifndef NUMERICS_HPP
#define NUMERICS_HPP
#include <cstdint>
#include <queue>
#include <string>
#include <vector>
#define MIN(A, B) ((A) < (B) ? (A) : (B))
#define MAX(A, B) ((A) > (B) ? (A) : (B))
typedef uint64_t word_t;
struct Fraction
{
word_t numerator, denominator;
Fraction(word_t numerator = 0, word_t denominator = 1);
bool operator<(const Fraction other);
bool operator==(const Fraction &other);
};
struct Node
{
Fraction value;
int64_t left, right;
Node(Fraction val = {}, int64_t left = -1, int64_t right = -1);
};
struct NodeAllocator
{
std::vector<Node> vec;
NodeAllocator(word_t capacity);
word_t alloc_node(Node n);
};
word_t gcd(word_t a, word_t b);
void iterate(std::queue<word_t> &queue, NodeAllocator &allocator);
std::string to_string(const Fraction &);
std::string to_string(const NodeAllocator &, const word_t, int depth = 1);
#endif