Commit ae40737672c54c90c23e60e5224dc023cbe7c1f6

Authored by David Mayerich
1 parent 26045f19

added support for variable length arguments in grid.h

Showing 2 changed files with 129 additions and 17 deletions   Show diff stats
@@ -5,18 +5,16 @@ @@ -5,18 +5,16 @@
5 #include <string> 5 #include <string>
6 #include <sstream> 6 #include <sstream>
7 #include <fstream> 7 #include <fstream>
  8 +#include <cstdarg>
8 9
9 -#include "../cuda/threads.h"  
10 -#include "../cuda/error.h"  
11 -#include "../cuda/devices.h"  
12 #include "../math/vector.h" 10 #include "../math/vector.h"
13 11
14 -  
15 namespace stim{ 12 namespace stim{
16 13
17 -//This object describes a generic D-dimensional grid containing data of type T  
18 - // data can be loaded in the form of images  
19 - // data can be saved in the form of binary files 14 +/**This object describes a generic D-dimensional grid containing data of type T.
  15 + Functions are provided for saving and loading binary data.
  16 +
  17 +**/
20 template<typename T, unsigned int D = 1> 18 template<typename T, unsigned int D = 1>
21 class grid{ 19 class grid{
22 20
@@ -25,7 +23,7 @@ protected: @@ -25,7 +23,7 @@ protected:
25 stim::vec<unsigned long, D> R; //elements in each dimension 23 stim::vec<unsigned long, D> R; //elements in each dimension
26 T* ptr; //pointer to the data (on the GPU or CPU) 24 T* ptr; //pointer to the data (on the GPU or CPU)
27 25
28 - //return the total number of values in the binary file 26 + ///Return the total number of values in the binary file
29 unsigned long samples(){ 27 unsigned long samples(){
30 28
31 unsigned long s = 1; 29 unsigned long s = 1;
@@ -33,12 +31,55 @@ protected: @@ -33,12 +31,55 @@ protected:
33 s *= R[d]; 31 s *= R[d];
34 32
35 return s; 33 return s;
  34 + }
  35 +
  36 + ///Initializes a grid by allocating the necessary memory and setting all values to zero
  37 + void init(){
  38 +
  39 + //calculate the total number of values
  40 + unsigned long S = samples();
  41 +
  42 + //allocate memory to store the grid
  43 + ptr = (T*)malloc(sizeof(T) * S);
  44 +
  45 + //initialize the memory to zero
  46 + memset(ptr, 0, sizeof(T) * S);
36 47
37 } 48 }
38 49
39 public: 50 public:
40 51
41 - //write data to disk 52 + ///Constructor used to specify the grid size as a vector
  53 +
  54 + /// @param _R is a vector describing the grid resolution
  55 + grid( stim::vec<unsigned long, D> _R){
  56 +
  57 + //set the grid resolution
  58 + R = _R;
  59 +
  60 + init();
  61 + }
  62 +
  63 + ///Constructor used to specify the grid size as a set of parameters
  64 +
  65 + /// @param X0... is a list of values describing the grid size along each dimension
  66 + grid( unsigned long X0, ...){
  67 +
  68 + R[0] = X0;
  69 +
  70 + va_list ap;
  71 + va_start(ap, X0);
  72 + for(unsigned int d = 1; d<D; d++)
  73 + R[d] = va_arg(ap, unsigned long);
  74 + va_end(ap);
  75 +
  76 + init();
  77 +
  78 + }
  79 +
  80 + ///Writes the binary data to disk
  81 +
  82 + /// @param filename is the name of the binary file to be written
42 void write(std::string filename){ 83 void write(std::string filename){
43 84
44 std::fstream file; 85 std::fstream file;
@@ -50,8 +91,11 @@ public: @@ -50,8 +91,11 @@ public:
50 file.write((char *)ptr, samples() * sizeof(T)); 91 file.write((char *)ptr, samples() * sizeof(T));
51 } 92 }
52 93
53 - //load a binary file from disk  
54 - // header size is in bytes 94 + ///Loads a binary file from disk
  95 +
  96 + /// @param filename is the name of the file containing the binary data
  97 + /// @param S is the size of the binary file along each dimension
  98 + /// @param header is the size of the header in bytes
55 void read(std::string filename, stim::vec<unsigned long, D> S, unsigned long header = 0){ 99 void read(std::string filename, stim::vec<unsigned long, D> S, unsigned long header = 0){
56 100
57 R = S; //set the sample resolution 101 R = S; //set the sample resolution
@@ -68,8 +112,69 @@ public: @@ -68,8 +112,69 @@ public:
68 file.read((char *)ptr, samples() * sizeof(T)); 112 file.read((char *)ptr, samples() * sizeof(T));
69 } 113 }
70 114
  115 + ///Gets a single value from the grid given a set of coordinates
  116 +
  117 + /// @param x0... is a list of coordinates specifying the desired value
  118 + T get(unsigned long x0, ...){
  119 +
  120 + va_list ap;
  121 +
  122 + unsigned long F = 1;
  123 + unsigned long p = x0;
  124 +
  125 + va_start(ap, x0);
  126 + for(unsigned int d = 1; d<D; d++){
  127 + F *= R[d-1];
  128 + p += va_arg(ap, unsigned int) * F;
  129 + }
  130 + va_end(ap);
  131 +
  132 + return ptr[p];
  133 + }
  134 +
  135 + ///Sets a value in the grid
  136 +
  137 + /// @param value is the grid point value
  138 + /// @x0... is the coordinate of the value to be set
  139 + void set(T value, unsigned long x0, ...){
  140 +
  141 + va_list ap;
  142 +
  143 + unsigned long F = 1;
  144 + unsigned long p = x0;
  145 +
  146 + va_start(ap, x0);
  147 + for(unsigned int d = 1; d<D; d++){
  148 + F *= R[d-1];
  149 + p += va_arg(ap, unsigned int) * F;
  150 + }
  151 + va_end(ap);
  152 +
  153 + ptr[p] = value;
  154 + }
  155 +
  156 + ///Outputs grid data as a string
  157 + std::string str(){
71 158
  159 + std::stringstream result;
72 160
  161 + result<<"stim::grid structure of size [";
  162 + for(unsigned int d = 0; d<D; d++){
  163 + if(d!=0) result<<", ";
  164 + result<<R[d];
  165 + }
  166 + result<<"]"<<std::endl;
  167 +
  168 + //calculate the number of values to output
  169 + unsigned long nV = min(R[0], (unsigned long)10);
  170 +
  171 + for(unsigned long v = 0; v<nV; v++){
  172 + result<<ptr[v];
  173 + if(v != nV-1) result<<", ";
  174 + }
  175 +
  176 + return result.str();
  177 + }
73 }; 178 };
74 179
75 } 180 }
stim/grids/image_stack.h
@@ -8,8 +8,9 @@ @@ -8,8 +8,9 @@
8 8
9 namespace stim{ 9 namespace stim{
10 10
11 -//this creates a class that can be used to load 3D grid data from stacks of images  
12 -// The class uses a 4D grid object, where the first dimension is color 11 +/**This class is used to load 3D grid data from stacks of images
  12 + The class uses a 4D grid object, where the first dimension is a color value.
  13 +**/
13 template<typename T> 14 template<typename T>
14 class image_stack : public virtual stim::grid<T, 4>{ 15 class image_stack : public virtual stim::grid<T, 4>{
15 16
@@ -22,6 +23,9 @@ protected: @@ -22,6 +23,9 @@ protected:
22 23
23 public: 24 public:
24 25
  26 + ///Load an image stack based on a file mask. Images are loaded in alphanumeric order.
  27 +
  28 + /// @param file_mask is the mask describing images to be loaded
25 void load_images(std::string file_mask){ 29 void load_images(std::string file_mask){
26 30
27 stim::filename file_path(file_mask); 31 stim::filename file_path(file_mask);
@@ -65,6 +69,10 @@ public: @@ -65,6 +69,10 @@ public:
65 } 69 }
66 } 70 }
67 71
  72 + ///Saves a single page to an image file
  73 +
  74 + /// @param file_name is the name of the image file to be created
  75 + /// @param i is the page to be saved
68 void save_image(std::string file_name, unsigned int i){ 76 void save_image(std::string file_name, unsigned int i){
69 77
70 //create an image 78 //create an image
@@ -76,6 +84,9 @@ public: @@ -76,6 +84,9 @@ public:
76 I.save(file_name); 84 I.save(file_name);
77 } 85 }
78 86
  87 + ///Saves the entire stack to a set of images
  88 +
  89 + /// @param file_mask is the mask describing how the file names will be saved (ex. image????.bmp)
79 void save_images(std::string file_mask){ 90 void save_images(std::string file_mask){
80 91
81 stim::filename file_path(file_mask); 92 stim::filename file_path(file_mask);
@@ -93,10 +104,6 @@ public: @@ -93,10 +104,6 @@ public:
93 save_image(file_list[i], i); 104 save_image(file_list[i], i);
94 } 105 }
95 106
96 -  
97 -  
98 -  
99 -  
100 }; 107 };
101 108
102 109