libs-gui/Source/GSCSEditVariableManager.m
Benjamin Johnson 305bcd56a3
Implement GSCSTableau, GSCSEditInfo, GSCSEditVariableManager (#186)
* Implement GSCSTableau, GSCSEditInfo, GSCSEditVariableManager

* Update GSTableau based on feedback

* Remove adding expression term variable to external parameteric variables
2023-08-05 10:26:22 +02:00

141 lines
3.5 KiB
Objective-C

/* Copyright (C) 2023 Free Software Foundation, Inc.
By: Benjamin Johnson
Date: 12-6-2023
This file is part of the GNUstep Library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110 USA.
*/
#import "GSCSEditVariableManager.h"
#import "GSFastEnumeration.h"
@implementation GSCSEditVariableManager
- (instancetype) init
{
self = [super init];
if (self)
{
ASSIGN(_editVariablesList, [NSMutableArray array]);
ASSIGN(_editVariablesStack, [NSMutableArray array]);
ASSIGN(_editVariablesMap,
[NSMapTable mapTableWithKeyOptions: NSMapTableStrongMemory
valueOptions: NSMapTableStrongMemory]);
[self pushEditVariableCount];
}
return self;
}
- (BOOL) isEmpty
{
return [_editVariablesList count] == 0;
}
- (NSArray *) editInfos
{
return _editVariablesList;
}
- (NSInteger) editVariableStackCount
{
return [_editVariablesStack count];
}
- (NSInteger) topEditVariableStack
{
return [[_editVariablesStack lastObject] integerValue];
}
- (void) pushEditVariableCount
{
[_editVariablesStack
addObject: [NSNumber numberWithInteger: [_editVariablesList count]]];
}
- (void) popEditVariableStack
{
[_editVariablesStack removeLastObject];
}
- (void) addEditInfo: (GSCSEditInfo *)editInfo
{
[_editVariablesMap setObject: editInfo forKey: [editInfo variable]];
[_editVariablesList addObject: editInfo];
}
- (void) removeEditInfo: (GSCSEditInfo *)editInfo
{
[_editVariablesList removeObject: editInfo];
}
- (void) removeEditInfoForConstraint: (GSCSConstraint *)constraint
{
GSCSEditInfo *editInfo = [self editInfoForConstraint: constraint];
[self removeEditInfo: editInfo];
}
- (GSCSEditInfo *) editInfoForConstraint: (GSCSConstraint *)constraint
{
FOR_IN(GSCSEditInfo *, editInfo, _editVariablesList)
if ([editInfo constraint] == constraint)
{
return editInfo;
}
END_FOR_IN(_editVariablesList);
return nil;
}
- (NSArray *) editInfosForVariable: (GSCSVariable *)editVariable
{
NSMutableArray *editInfos = [NSMutableArray array];
FOR_IN(GSCSEditInfo *, editInfo, _editVariablesList)
if ([editInfo variable] == editVariable)
{
[editInfos addObject: editInfo];
}
END_FOR_IN(_editVariablesList);
return editInfos;
}
- (NSArray *) getNextSet
{
[_editVariablesStack removeLastObject];
NSInteger index = [self topEditVariableStack];
NSInteger count = [_editVariablesList count];
NSMutableArray *editableInfosInDescendingOrder = [NSMutableArray array];
while (count > index)
{
GSCSEditInfo *editInfo = [[self editInfos] objectAtIndex: count - 1];
[editableInfosInDescendingOrder addObject: editInfo];
count--;
}
return editableInfosInDescendingOrder;
}
- (void) dealloc
{
RELEASE(_editVariablesList);
RELEASE(_editVariablesStack);
RELEASE(_editVariablesMap);
[super dealloc];
}
@end