// Copyright (c) 2014 Alex Diener. All rights reserved. #include "watertowerclassic/LevelSetModel.h" #include #include #define SUPERCLASS StemObject LevelSetModel * LevelSetModel_create(const char * name) { stemobject_create_implementation(LevelSetModel, init, name) } LevelSetModel * LevelSetModel_copy(LevelSetModel * self) { stemobject_copy_implementation(LevelSetModel, initCopy) } static void sharedInit(LevelSetModel * self) { call_super(init, self); self->dispose = LevelSetModel_dispose; } #if defined(STEM_PLATFORM_win32) || defined(STEM_PLATFORM_win64) static char * strndup(const char * s1, size_t n) { size_t len = 0; char * s2; while (len < n && s1[len] != 0) { len++; } s2 = malloc(len + 1); memcpy(s2, s1, len); s2[len] = 0; return s2; } #endif bool LevelSetModel_init(LevelSetModel * self, const char * name) { sharedInit(self); self->levelCount = 0; self->levels = NULL; self->name = strndup(name, LEVEL_SET_NAME_MAX); return true; } bool LevelSetModel_initCopy(LevelSetModel * self, LevelSetModel * copy) { unsigned int levelIndex; sharedInit(self); self->levelCount = copy->levelCount; self->levels = malloc(sizeof(LevelModel *) * self->levelCount); self->name = strndup(copy->name, LEVEL_SET_NAME_MAX); for (levelIndex = 0; levelIndex < self->levelCount; levelIndex++) { self->levels[levelIndex] = LevelModel_copy(copy->levels[levelIndex]); } return true; } void LevelSetModel_dispose(LevelSetModel * self) { unsigned int levelIndex; for (levelIndex = 0; levelIndex < self->levelCount; levelIndex++) { self->levels[levelIndex]->dispose(self->levels[levelIndex]); } free(self->levels); free(self->name); call_super(dispose, self); } LevelModel * LevelSetModel_copyLevelAtIndex(LevelSetModel * self, unsigned int index) { if (index >= self->levelCount) { return NULL; } return LevelModel_copy(self->levels[index]); } void LevelSetModel_swapLevels(LevelSetModel * self, unsigned int index1, unsigned int index2) { LevelModel * level; if (index1 >= self->levelCount || index2 >= self->levelCount) { return; } level = self->levels[index1]; self->levels[index1] = self->levels[index2]; self->levels[index2] = level; } void LevelSetModel_addLevelAtIndex(LevelSetModel * self, LevelModel * newLevel, unsigned int index) { unsigned int index2; if (self->levelCount >= LEVEL_COUNT_MAX) { return; } self->levels = realloc(self->levels, sizeof(LevelModel *) * (self->levelCount + 1)); for (index2 = self->levelCount; index2 > index; index2--) { self->levels[index2] = self->levels[index2 - 1]; } self->levels[index] = newLevel; self->levelCount++; } void LevelSetModel_deleteLevelAtIndex(LevelSetModel * self, unsigned int index) { if (index >= self->levelCount || self->levelCount < 2) { return; } LevelModel_dispose(self->levels[index]); self->levelCount--; for (; index < self->levelCount; index++) { self->levels[index] = self->levels[index + 1]; } }