1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
/* Copyright (c) 1997-2024
Ewgenij Gawrilow, Michael Joswig, and the polymake team
Technische Universität Berlin, Germany
https://polymake.org
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 2, or (at your option) any
later version: http://www.gnu.org/licenses/gpl.txt.
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.
--------------------------------------------------------------------------------
*/
#pragma once
#include "polymake/internal/converters_basic_defs.h"
#include <iostream>
#include <limits>
namespace polymake { namespace topaz {
enum class GF2_old : uint8_t { zero = 0, one = 1 };
inline GF2_old operator+(GF2_old x) { return x; }
inline GF2_old operator-(GF2_old x) { return x; }
inline GF2_old operator+ (GF2_old a, GF2_old b) { return GF2_old(int(a)^int(b)); }
inline GF2_old operator- (GF2_old a, GF2_old b) { return GF2_old(int(a)^int(b)); }
inline GF2_old operator* (GF2_old a, GF2_old b) { return GF2_old(int(a)&int(b)); }
inline GF2_old operator/ (GF2_old a, GF2_old b) { return GF2_old(int(a)/int(b)); }
inline GF2_old& operator+= (GF2_old& a, GF2_old b) { return a = a+b; }
inline GF2_old& operator-= (GF2_old& a, GF2_old b) { return a = a-b; }
inline GF2_old& operator*= (GF2_old& a, GF2_old b) { return a = a*b; }
inline GF2_old& operator/= (GF2_old& a, GF2_old b) { return a = a/b; }
template <typename Traits>
std::basic_istream<char, Traits>&
operator>> (std::basic_istream<char, Traits>& is, GF2_old& a)
{
int val;
is >> val;
if (val == 0)
a = GF2_old::zero;
else if (val == 1)
a = GF2_old::one;
else
is.setstate(std::ios::failbit);
return is;
}
template <typename Traits>
std::basic_ostream<char, Traits>&
operator<< (std::basic_ostream<char, Traits>& os, GF2_old a)
{
return os << int(a);
}
template <typename T, bool is_integer = std::numeric_limits<T>::is_integer>
class conv_to_GF2_old;
template <typename T>
class conv_to_GF2_old<T, true> {
public:
typedef T argument_type;
typedef GF2_old result_type;
result_type operator() (const T& x) const { return result_type(x%2); }
};
} } // end namespace polymake::topaz
namespace std {
template <>
struct numeric_limits<polymake::topaz::GF2_old> : numeric_limits<unsigned int> {
static polymake::topaz::GF2_old min() throw() { return polymake::topaz::GF2_old::zero; }
static polymake::topaz::GF2_old max() throw() { return polymake::topaz::GF2_old::one; }
static const int digits = 1;
static const int digits10 = 1;
};
}
namespace pm {
template <typename T>
class conv<T, polymake::topaz::GF2_old> : public polymake::topaz::conv_to_GF2_old<T> { };
template <>
class conv<polymake::topaz::GF2_old, polymake::topaz::GF2_old> : public trivial_conv<polymake::topaz::GF2_old> { } ;
template<>
struct algebraic_traits<polymake::topaz::GF2_old> {
typedef polymake::topaz::GF2_old field_type;
};
template <>
struct spec_object_traits<polymake::topaz::GF2_old>
: spec_object_traits<is_scalar> {
static
bool is_zero(const polymake::topaz::GF2_old& a)
{
return a == polymake::topaz::GF2_old::zero;
}
static
bool is_one(const polymake::topaz::GF2_old& a)
{
return a == polymake::topaz::GF2_old::one;
}
static const polymake::topaz::GF2_old& zero() { static const auto z = polymake::topaz::GF2_old::zero; return z; }
static const polymake::topaz::GF2_old& one() { static const auto o = polymake::topaz::GF2_old::one; return o; }
};
}
// Local Variables:
// mode:C++
// c-basic-offset:3
// indent-tabs-mode:nil
// End:
|