Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/vis15/src/lib/include/diderot/dynseq.hxx
ViewVC logotype

Annotation of /branches/vis15/src/lib/include/diderot/dynseq.hxx

Parent Directory Parent Directory | Revision Log Revision Log


Revision 4526 - (view) (download) (as text)

1 : jhr 3981 /*! \file dynseq.hxx
2 :     *
3 :     * \author John Reppy
4 :     */
5 :    
6 :     /*
7 :     * This code is part of the Diderot Project (http://diderot-language.cs.uchicago.edu)
8 :     *
9 :     * COPYRIGHT (c) 2016 The University of Chicago
10 :     * All rights reserved.
11 :     */
12 :    
13 :     #ifndef _DIDEROT_DYNSEQ_HXX_
14 :     #define _DIDEROT_DYNSEQ_HXX_
15 :    
16 :     #include <memory>
17 :     #include <vector>
18 :     #include <initializer_list>
19 :     #include <teem/nrrd.h>
20 :    
21 :     namespace diderot {
22 :    
23 : jhr 4028 namespace __details {
24 : jhr 4351 template <typename T> using load_fn_ptr = T (*) (const void *);
25 : jhr 4028 } // __details
26 :    
27 : jhr 4006 template <typename T> struct dynseq_traits;
28 :     // using value_type = ...;
29 :     // using base_type = ...;
30 : jhr 4028 // static __details::load_fn_ptr<base_type> get_load_fn (int ty);
31 : jhr 4526 // static const bool scalar = ...;
32 :     // static const uint32_t values_per_elem = ...;
33 : jhr 4006
34 : jhr 3981 template <typename T>
35 :     class dynseq {
36 :     public:
37 :    
38 : jhr 4351 using traits = dynseq_traits<T>;
39 : jhr 4028
40 : jhr 3981 //! construct an empty sequence
41 : jhr 4351 dynseq ();
42 : jhr 4028 //! construct an uninitialized sequence with the given number of elements
43 : jhr 4351 dynseq (uint32_t n);
44 : jhr 3981 //! construct a sequence from a fixed-size array
45 : jhr 4351 dynseq (uint32_t n, const T *data);
46 : jhr 3981 //! construct a sequence from an array initializer (e.g., `dynseq{1, 2, 3}`)
47 : jhr 4351 dynseq (std::initializer_list<T> il);
48 : jhr 3982 //! construct a sequence for a range lo..hi (integer types only)
49 : jhr 4351 dynseq (T const &lo, T const &hi);
50 : jhr 3982 //! copy constructor; this just copies the reference
51 : jhr 4351 dynseq (const dynseq &seq);
52 : jhr 3982 //! copy constructor with additional space reserved
53 : jhr 4351 dynseq (const dynseq &seq, uint32_t n);
54 : jhr 3981
55 : jhr 4351 ~dynseq () { };
56 : jhr 3981
57 : jhr 4071 // load a sequence from a nrrd or nrrd file; return true on error
58 : jhr 4351 bool load (world_base *wrld, const Nrrd *nin);
59 :     bool load (world_base *wrld, std::string const &file);
60 : jhr 4071
61 : jhr 4351 uint32_t length () const { return this->_seq->size(); }
62 : jhr 3982
63 : jhr 4351 const T& operator[] (uint32_t i) const { return (*this->_seq)[i]; }
64 : jhr 3981
65 : jhr 4351 typename std::vector<T>::const_iterator cbegin() const noexcept
66 :     {
67 :     return this->_seq->cbegin();
68 :     }
69 :     typename std::vector<T>::const_iterator cend() const noexcept
70 :     {
71 :     return this->_seq->cend();
72 :     }
73 : jhr 3981
74 : jhr 3982 // destructive operations for adding elements to a sequence
75 : jhr 4351 dynseq &prepend (T const &x);
76 : jhr 4412 dynseq &prepend (const void *datap);
77 : jhr 4351 dynseq &append (T const &x);
78 : jhr 4412 dynseq &append (const void *datap);
79 : jhr 4351 dynseq &concat (dynseq const &seq);
80 : jhr 3982
81 :     // wrappers for the above operations
82 : jhr 4351 static dynseq prepend (T const &x, dynseq<T> const &seq)
83 :     {
84 :     dynseq result(seq, 1);
85 :     return result.prepend(x);
86 :     }
87 :     static dynseq append (dynseq const &seq, T const &x)
88 :     {
89 :     dynseq result(seq, 1);
90 :     return result.append(x);
91 :     }
92 :     static dynseq concat (dynseq const &seq1, dynseq<T> const &seq2)
93 :     {
94 :     dynseq result(seq1, seq2.length());
95 :     return result.concat(seq2);
96 :     }
97 : jhr 3982
98 : jhr 4351 void *data () const { return this->_seq->data(); }
99 : jhr 3988
100 : jhr 4065 // copy the contents of the sequence to the specified address and return the address
101 :     // immediately following the copied data
102 : jhr 4351 char *copy_to (char *cp);
103 : jhr 4065
104 : jhr 3981 private:
105 : jhr 4351 std::shared_ptr<std::vector<T>> _seq;
106 : jhr 3981 };
107 :    
108 :     /***** inline functions *****/
109 :    
110 :     template <typename T>
111 : jhr 4032 inline dynseq<T>::dynseq ()
112 : jhr 4351 : _seq(std::make_shared<std::vector<T>>(std::vector<T>()))
113 : jhr 3981 { }
114 :    
115 :     template <typename T>
116 : jhr 4032 inline dynseq<T>::dynseq (uint32_t nelems)
117 : jhr 4351 : _seq(std::make_shared<std::vector<T>>(std::vector<T>(nelems)))
118 : jhr 4028 { }
119 :    
120 :     template <typename T>
121 : jhr 4032 inline dynseq<T>::dynseq (uint32_t n, const T *data)
122 : jhr 4351 : _seq(std::make_shared<std::vector<T>>(std::vector<T>()))
123 : jhr 3981 {
124 : jhr 4351 this->_seq->reserve (n);
125 : jhr 4354 for (int i = 0; i < n; i++) {
126 :     this->_seq->push_back(data[i]);
127 :     }
128 : jhr 3981 }
129 :    
130 :     template <typename T>
131 : jhr 4032 inline dynseq<T>::dynseq (std::initializer_list<T> il)
132 : jhr 4351 : _seq(std::make_shared<std::vector<T>>(std::vector<T>(il)))
133 : jhr 3981 { }
134 :    
135 : jhr 4032 template <typename T>
136 :     inline dynseq<T>::dynseq (dynseq const &seq)
137 : jhr 4351 : _seq(seq._seq)
138 : jhr 4032 { }
139 :    
140 : jhr 3981 } // namespace diderot
141 :    
142 : jhr 3987 #include "dynseq-inst.hxx"
143 :    
144 : jhr 3981 #endif // !_DIDEROT_DYNSEQ_HXX_

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0