Skip to content

Commit e5f3bb1

Browse files
author
Martin Klang
committed
simplified Resource interface, return empty resource if not found, pass by value
1 parent ad8bc5d commit e5f3bb1

2 files changed

Lines changed: 34 additions & 32 deletions

File tree

LibSource/Resource.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#include "OpenWareMidiControl.h"
55
#include "ServiceCall.h"
66
#include "ProgramVector.h"
7-
#include "FloatArray.h"
87

98
template<typename Array, typename Element>
109
Array Resource::asArray(size_t offset, size_t max_size) {
@@ -16,43 +15,41 @@ Array Resource::asArray(size_t offset, size_t max_size) {
1615

1716
template FloatArray Resource::asArray<FloatArray, float>(size_t offset, size_t max_size);
1817

19-
void Resource::destroy(Resource* resource) {
20-
if (resource && resource->allocated)
21-
delete[] (uint8_t*)resource->data;
22-
delete resource;
18+
Resource::~Resource() {
19+
if(allocated)
20+
delete[] (uint8_t*)data;
2321
}
2422

25-
Resource* Resource::open(const char* name){
23+
Resource Resource::open(const char* name){
2624
uint8_t* data = NULL;
2725
size_t offset = 0;
2826
size_t size = 0;
2927
void* args[] = {
3028
(void*)name, (void*)&data, (void*)&offset, (void*)&size
3129
};
3230
if(getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK)
33-
return new Resource(name, size, data);
34-
return NULL;
31+
return Resource(name, size, data);
32+
return Resource();
3533
}
3634

37-
Resource* Resource::load(const char* name){
38-
Resource* resource = Resource::open(name);
39-
if(resource != NULL && resource->data == NULL){
40-
uint8_t* data = new uint8_t[resource->size];
35+
Resource Resource::load(const char* name){
36+
Resource resource = Resource::open(name);
37+
if(resource.exists() && !resource.hasData()){
38+
uint8_t* data = new uint8_t[resource.size];
4139
size_t offset = 0;
4240
void* args[] = {
43-
(void*)name, (void*)&data, (void*)&offset, (void*)&resource->size
41+
(void*)name, (void*)&data, (void*)&offset, (void*)&resource.size
4442
};
4543
if (getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK){
46-
resource->data = data;
47-
resource->allocated = true;
44+
resource.data = data;
45+
resource.allocated = true;
4846
}else{
4947
delete[] data;
5048
}
5149
}
5250
return resource;
5351
}
5452

55-
5653
size_t Resource::read(void* dest, size_t len, size_t offset){
5754
if(this->data == NULL){
5855
void* args[] = {

LibSource/Resource.h

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define __RESOURCE_STORAGE_H__
33

44
#include <cstddef>
5+
#include "FloatArray.h"
56

67
class Resource {
78
public:
@@ -26,6 +27,10 @@ class Resource {
2627
return size;
2728
}
2829

30+
bool exists() const {
31+
return size != 0;
32+
}
33+
2934
/**
3035
* Get resource name
3136
*/
@@ -42,28 +47,26 @@ class Resource {
4247
template<typename Array, typename Element>
4348
Array asArray(size_t offset = 0, size_t max_size = 0xFFFFFFFF);
4449

50+
FloatArray asFloatArray(size_t offset = 0, size_t max_size = 0xFFFFFFFF){
51+
return asArray<FloatArray, float>(offset, max_size);
52+
}
53+
4554
/**
46-
* Get resource from storage. Creates a new Resource on the heap.
47-
* Should be garbage collected with Resource::destroy()
55+
* Get resource from storage.
4856
*
4957
* @param name resource name
5058
*
5159
* @return NULL if resource does not exist or can't be read.
5260
*
5361
*/
54-
static Resource* open(const char* name);
55-
56-
/**
57-
* Open resource and load data. Creates a new Resource on the heap and
58-
* allocates extra memory if required.
59-
* Must be garbage collected with Resource::destroy()
60-
*/
61-
static Resource* load(const char* name);
62+
static Resource open(const char* name);
6263

6364
/**
64-
* Destroy allocated memory used by a resource
65+
* Open resource and load data.
66+
* Allocates extra memory if required, which will be garbage collected
67+
* in the object destructor.
6568
*/
66-
static void destroy(Resource* resource);
69+
static Resource load(const char* name);
6770

6871
/**
6972
* Read data from resource into memory
@@ -75,12 +78,14 @@ class Resource {
7578
*/
7679
size_t read(void* dest, size_t len, size_t offset=0);
7780

81+
Resource(): name(NULL), size(0), data(NULL), allocated(false) {}
82+
~Resource();
7883
protected:
7984
Resource(const char* name, size_t size, void* data)
8085
: name(name), size(size), data(data) {}
81-
const char* name = NULL;
82-
size_t size = 0;
83-
void* data = NULL;
84-
bool allocated = false;
86+
const char* name;
87+
size_t size;
88+
void* data;
89+
bool allocated;
8590
};
8691
#endif

0 commit comments

Comments
 (0)