diff options
author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-15 22:09:13 +0200 |
---|---|---|
committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-15 22:09:13 +0200 |
commit | 47da9c1e9ac25b3248a808f4519e2c64ecb8e2b4 (patch) | |
tree | 8a237a5a18e7b91a2c83473bd6b0a9db381daab0 /MLKInteger.m | |
parent | c2efa347a8e5f1d83427c34defa953e594a2bb12 (diff) |
Add class MLKInteger.
Diffstat (limited to 'MLKInteger.m')
-rw-r--r-- | MLKInteger.m | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/MLKInteger.m b/MLKInteger.m new file mode 100644 index 0000000..b9e9bf4 --- /dev/null +++ b/MLKInteger.m @@ -0,0 +1,101 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Étoilisp/Mulklisp, a Common Lisp subset for the Étoilé runtime. + * Copyright (C) 2008 Matthias Andreas Benkard. + * + * 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 <http://www.gnu.org/licenses/>. + */ + +#import "MLKInteger.h" + +#import <Foundation/NSString.h> + + +@implementation MLKInteger +-(MLKInteger *) initWithMPZ:(mpz_t)mpz +{ + self = [super init]; + mpz_init_set (value, mpz); + return self; +} + +-(MLKInteger *) initWithString:(NSString *)string + negative:(BOOL)negative + base:(unsigned int)base +{ + self = [super init]; + mpz_init_set_str (value, [string UTF8String], base); + if (negative) mpz_neg (value, value); + return self; +} + ++(MLKInteger *) integerWithMPZ:(mpz_t)mpz +{ + return AUTORELEASE ([[MLKInteger alloc] initWithMPZ:mpz]); +} + ++(MLKInteger *) integerWithString:(NSString *)string + negative:(BOOL)negative + base:(unsigned int)base +{ + return AUTORELEASE ([[MLKInteger alloc] initWithString:string + negative:negative + base:base]); +} + +#define DEFINE_MPZ_OPERATION(selector, mpzop) \ + -(MLKInteger *) selector (MLKInteger *)arg \ + { \ + mpz_t mpz; \ + MLKInteger *result; \ + \ + mpz_init (mpz); \ + mpzop (mpz, self->value, arg->value); \ + result = [MLKInteger integerWithMPZ:mpz]; \ + mpz_clear (mpz); \ + \ + return result; \ + } + +DEFINE_MPZ_OPERATION (add:, mpz_add) +DEFINE_MPZ_OPERATION (subtract:, mpz_sub) +DEFINE_MPZ_OPERATION (multiplyWith:, mpz_mul) +DEFINE_MPZ_OPERATION (divideBy:, mpz_div) + +-(int) intValue +{ + return mpz_get_si (value); +} + +-(NSString *) description +{ + return [self descriptionWithBase:10]; +} + +-(NSString *) descriptionWithBase:(int)base +{ + NSString *str; + char cstr[mpz_sizeinbase (self->value, base) + 2]; + + mpz_get_str (cstr, base, self->value); + str = [NSString stringWithUTF8String:cstr]; + + return str; +} + +-(void) dealloc +{ + mpz_clear (value); + [super dealloc]; +} +@end |