SheafSystem  0.0.0.0
primitive_traits.h
1 
2 //
3 // Copyright (c) 2014 Limit Point Systems, Inc.
4 //
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 // http://www.apache.org/licenses/LICENSE-2.0
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 
18 // Interface for class xxx
19 
20 #ifndef PRIMITIVE_TRAITS_H
21 #define PRIMITIVE_TRAITS_H
22 
23 #ifndef SHEAF_DLL_SPEC_H
24 #include "SheafSystem/sheaf_dll_spec.h"
25 #endif
26 
27 #ifndef STD_CSTRING_H
28 #include "SheafSystem/std_cstring.h"
29 #endif
30 
31 #ifndef PRIMITIVE_TYPE_H
32 #include "SheafSystem/primitive_type.h"
33 #endif
34 
35 namespace sheaf
36 {
37 
41 template <typename T>
42 struct SHEAF_DLL_SPEC primitive_traits
43 {
44 
48  typedef T type;
49 
53  static primitive_type id();
54 
58  static size_type size();
59 
63  static size_type alignment();
64 
68  static std::string name();
69 
73  static std::string aliases();
74 
78  static std::string hdf_type_name();
79 
83  static int hdf_type();
84 
88  static T default_value();
89 
90 };
91 
92 // Template specializations.
93 // All functions defined inline, except hdf_type which is
94 // defined in primitive_traits.cc to encapsulate hdf.
95 
96 
97 template<>
98 struct SHEAF_DLL_SPEC primitive_traits<bool>
99 {
100  typedef bool type;
101  static primitive_type id()
102  {
103  return BOOL;
104  };
105  static size_type size()
106  {
107  return sizeof(bool);
108  };
109 
110 
111  static size_type alignment()
112  {
113  struct alignment_type
114  {
115  char pad;
116  bool prim;
117  };
118  return offsetof(alignment_type, prim);
119  };
120  static const std::string& name()
121  {
122  static const std::string result("BOOL");
123  return result;
124  };
125  static const std::string& aliases()
126  {
127  static const std::string result;
128  return result;
129  };
130  static const std::string& hdf_type_name()
131  {
132  static const std::string result("SHF_PRIMITIVE_BOOL");
133  return result;
134  };
135  static int hdf_type();
136  static bool default_value()
137  {
138  return false;
139  };
140 
141 };
142 
143 template<>
144 struct SHEAF_DLL_SPEC primitive_traits<char>
145 {
146  typedef char type;
147  static primitive_type id()
148  {
149  return CHAR;
150  };
151  static size_type size()
152  {
153  return sizeof(char);
154  };
155  static size_type alignment()
156  {
157  struct alignment_type
158  {
159  char pad;
160  char prim;
161  };
162  return offsetof(alignment_type, prim);
163  };
164  static const std::string& name()
165  {
166  static const std::string result("CHAR");
167  return result;
168  };
169  static const std::string& aliases()
170  {
171  static const std::string result;
172  return result;
173  };
174  static const std::string& hdf_type_name()
175  {
176  static const std::string result("SHF_PRIMITIVE_CHAR");
177  return result;
178  };
179  static int hdf_type();
180  static char default_value()
181  {
182  return '\0';
183  };
184 };
185 
186 template<>
187 struct SHEAF_DLL_SPEC primitive_traits<signed char>
188 {
189  typedef signed char type;
190  static primitive_type id()
191  {
192  return SIGNED_CHAR;
193  };
194  static size_type size()
195  {
196  return sizeof(signed char);
197  };
198  static size_type alignment()
199  {
200  struct alignment_type
201  {
202  char pad;
203  signed char prim;
204  };
205  return offsetof(alignment_type, prim);
206  };
207  static const std::string& name()
208  {
209  static const std::string result("SIGNED_CHAR");
210  return result;
211  };
212  static const std::string& aliases()
213  {
214  static const std::string result;
215  return result;
216  };
217  static const std::string& hdf_type_name()
218  {
219  static const std::string result("SHF_PRIMITIVE_SIGNED_CHAR");
220  return result;
221  };
222  static int hdf_type();
223  static signed char default_value()
224  {
225  return '\0';
226  };
227 };
228 
229 template<>
230 struct SHEAF_DLL_SPEC primitive_traits<short int>
231 {
232  typedef short int type;
233  static primitive_type id()
234  {
235  return SHORT_INT;
236  };
237  static size_type size()
238  {
239  return sizeof(short int);
240  };
241  static size_type alignment()
242  {
243  struct alignment_type
244  {
245  char pad;
246  short int prim;
247  };
248  return offsetof(alignment_type, prim);
249  };
250  static const std::string& name()
251  {
252  static const std::string result("SHORT_INT");
253  return result;
254  };
255  static const std::string& aliases()
256  {
257  static const std::string result;
258  return result;
259  };
260  static const std::string& hdf_type_name()
261  {
262  static const std::string result("SHF_PRIMITIVE_SHORT_INT");
263  return result;
264  };
265  static int hdf_type();
266  static short int default_value()
267  {
268  return 0;
269  };
270 };
271 
272 template<>
273 struct SHEAF_DLL_SPEC primitive_traits<int>
274 {
275  typedef int type;
276  static primitive_type id()
277  {
278  return INT;
279  };
280  static size_type size()
281  {
282  return sizeof(int);
283  };
284  static size_type alignment()
285  {
286  struct alignment_type
287  {
288  char pad;
289  int prim;
290  };
291  return offsetof(alignment_type, prim);
292  };
293  static const std::string& name()
294  {
295  static const std::string result("INT");
296  return result;
297  };
298  static const std::string& aliases()
299  {
300  static const std::string result("INT_TYPE POD_INDEX_TYPE");
301  return result;
302  };
303  static const std::string& hdf_type_name()
304  {
305  static const std::string result("SHF_PRIMITIVE_INT");
306  return result;
307  };
308  static int hdf_type();
309  static int default_value()
310  {
311  return 0;
312  };
313 };
314 
315 template<>
316 struct SHEAF_DLL_SPEC primitive_traits<long int>
317 {
318  typedef long int type;
319  static primitive_type id()
320  {
321  return LONG_INT;
322  };
323  static size_type size()
324  {
325  return sizeof(long int);
326  };
327  static size_type alignment()
328  {
329  struct alignment_type
330  {
331  char pad;
332  long int prim;
333  };
334  return offsetof(alignment_type, prim);
335  };
336  static const std::string& name()
337  {
338  static const std::string result("LONG_INT");
339  return result;
340  };
341  static const std::string& aliases()
342  {
343  static const std::string result;
344  return result;
345  };
346  static const std::string& hdf_type_name()
347  {
348  static const std::string result("SHF_PRIMITIVE_LONG_INT");
349  return result;
350  };
351  static int hdf_type();
352  static long int default_value()
353  {
354  return 0;
355  };
356 };
357 
358 template<>
359 struct SHEAF_DLL_SPEC primitive_traits<long long int>
360 {
361  typedef long long int type;
362  static primitive_type id()
363  {
364  return LONG_LONG_INT;
365  };
366  static size_type size()
367  {
368  return sizeof(long long int);
369  };
370  static size_type alignment()
371  {
372  struct alignment_type
373  {
374  char pad;
375  long long int prim;
376  };
377  return offsetof(alignment_type, prim);
378  };
379  static const std::string& name()
380  {
381  static const std::string result("LONG_LONG_INT");
382  return result;
383  };
384  static const std::string& aliases()
385  {
386  static const std::string result;
387  return result;
388  };
389  static const std::string& hdf_type_name()
390  {
391  static const std::string result("SHF_PRIMITIVE_LONG_LONG_INT");
392  return result;
393  };
394  static int hdf_type();
395  static long long int default_value()
396  {
397  return 0;
398  };
399 };
400 
401 template<>
402 struct SHEAF_DLL_SPEC primitive_traits<unsigned char>
403 {
404  typedef unsigned char type;
405  static primitive_type id()
406  {
407  return UNSIGNED_CHAR;
408  };
409  static size_type size()
410  {
411  return sizeof(unsigned char);
412  };
413  static size_type alignment()
414  {
415  struct alignment_type
416  {
417  char pad;
418  unsigned char prim;
419  };
420  return offsetof(alignment_type, prim);
421  };
422  static const std::string& name()
423  {
424  static const std::string result("UNSIGNED_CHAR");
425  return result;
426  };
427  static const std::string& aliases()
428  {
429  static const std::string result;
430  return result;
431  };
432  static const std::string& hdf_type_name()
433  {
434  static const std::string result("SHF_PRIMITIVE_UNSIGNED_CHAR");
435  return result;
436  };
437  static int hdf_type();
438  static unsigned char default_value()
439  {
440  return '\0';
441  };
442 };
443 
444 template<>
445 struct SHEAF_DLL_SPEC primitive_traits<unsigned short int>
446 {
447  typedef short int type;
448  static primitive_type id()
449  {
450  return UNSIGNED_SHORT_INT;
451  };
452  static size_type size()
453  {
454  return sizeof(unsigned short int);
455  };
456  static size_type alignment()
457  {
458  struct alignment_type
459  {
460  char pad;
461  unsigned short int prim;
462  };
463  return offsetof(alignment_type, prim);
464  };
465  static const std::string& name()
466  {
467  static const std::string result("UNSIGNED_SHORT_INT");
468  return result;
469  };
470  static const std::string& aliases()
471  {
472  static const std::string result;
473  return result;
474  };
475  static const std::string& hdf_type_name()
476  {
477  static const std::string result("SHF_PRIMITIVE_UNSIGNED_SHORT_INT");
478  return result;
479  };
480  static int hdf_type();
481  static unsigned short int default_value()
482  {
483  return 0;
484  };
485 };
486 
487 template<>
488 struct SHEAF_DLL_SPEC primitive_traits<unsigned int>
489 {
490  typedef int type;
491  static primitive_type id()
492  {
493  return UNSIGNED_INT;
494  };
495  static size_type size()
496  {
497  return sizeof(unsigned int);
498  };
499  static size_type alignment()
500  {
501  struct alignment_type
502  {
503  char pad;
504  unsigned int prim;
505  };
506  return offsetof(alignment_type, prim);
507  };
508  static const std::string& name()
509  {
510  static const std::string result("UNSIGNED_INT");
511  return result;
512  };
513  static const std::string& aliases()
514  {
515  static const std::string result;
516  return result;
517  };
518  static const std::string& hdf_type_name()
519  {
520  static const std::string result("SHF_PRIMITIVE_UNSIGNED_INT");
521  return result;
522  };
523  static int hdf_type();
524  static unsigned int default_value()
525  {
526  return 0;
527  };
528 };
529 
530 template<>
531 struct SHEAF_DLL_SPEC primitive_traits<unsigned long int>
532 {
533  typedef long int type;
534  static primitive_type id()
535  {
536  return UNSIGNED_LONG_INT;
537  };
538  static size_type size()
539  {
540  return sizeof(unsigned long int);
541  };
542  static size_type alignment()
543  {
544  struct alignment_type
545  {
546  char pad;
547  unsigned long int prim;
548  };
549  return offsetof(alignment_type, prim);
550  };
551  static const std::string& name()
552  {
553  static const std::string result("UNSIGNED_LONG_INT");
554  return result;
555  };
556  static const std::string& aliases()
557  {
558  static const std::string result("SIZE_TYPE");
559  return result;
560  };
561  static const std::string& hdf_type_name()
562  {
563  static const std::string result("SHF_PRIMITIVE_UNSIGNED_LONG_INT");
564  return result;
565  };
566  static int hdf_type();
567  static unsigned long int default_value()
568  {
569  return 0;
570  };
571 };
572 
573 template<>
574 struct SHEAF_DLL_SPEC primitive_traits<unsigned long long int>
575 {
576  typedef long long int type;
577  static primitive_type id()
578  {
579  return UNSIGNED_LONG_LONG_INT;
580  };
581  static size_type size()
582  {
583  return sizeof(unsigned long long int);
584  };
585  static size_type alignment()
586  {
587  struct alignment_type
588  {
589  char pad;
590  unsigned long long int prim;
591  };
592  return offsetof(alignment_type, prim);
593  };
594  static const std::string& name()
595  {
596  static const std::string result("UNSIGNED_LONG_LONG_INT");
597  return result;
598  };
599  static const std::string& aliases()
600  {
601  static const std::string result;
602  return result;
603  };
604  static const std::string& hdf_type_name()
605  {
606  static const std::string result("SHF_PRIMITIVE_UNSIGNED_LONG_LONG_INT");
607  return result;
608  };
609  static int hdf_type();
610  static unsigned long long int default_value()
611  {
612  return 0;
613  };
614 };
615 
616 template<>
617 struct SHEAF_DLL_SPEC primitive_traits<float>
618 {
619  typedef float type;
620  static primitive_type id()
621  {
622  return FLOAT;
623  };
624  static size_type size()
625  {
626  return sizeof(float);
627  };
628  static size_type alignment()
629  {
630  struct alignment_type
631  {
632  char pad;
633  float prim;
634  };
635  return offsetof(alignment_type, prim);
636  };
637  static const std::string& name()
638  {
639  static const std::string result("FLOAT");
640  return result;
641  };
642  static const std::string& aliases()
643  {
644  static const std::string result;
645  return result;
646  };
647  static const std::string& hdf_type_name()
648  {
649  static const std::string result("SHF_PRIMITIVE_FLOAT");
650  return result;
651  };
652  static int hdf_type();
653  static float default_value()
654  {
655  return 0.0;
656  };
657 };
658 
659 template<>
660 struct SHEAF_DLL_SPEC primitive_traits<double>
661 {
662  typedef double type;
663  static primitive_type id()
664  {
665  return DOUBLE;
666  };
667  static size_type size()
668  {
669  return sizeof(double);
670  };
671  static size_type alignment()
672  {
673  struct alignment_type
674  {
675  char pad;
676  double prim;
677  };
678  return offsetof(alignment_type, prim);
679  };
680  static const std::string& name()
681  {
682  static const std::string result("DOUBLE");
683  return result;
684  };
685  static const std::string& aliases()
686  {
687  static const std::string result;
688  return result;
689  };
690  static const std::string& hdf_type_name()
691  {
692  static const std::string result("SHF_PRIMITIVE_DOUBLE");
693  return result;
694  };
695  static int hdf_type();
696  static double default_value()
697  {
698  return 0.0;
699  };
700 };
701 
702 template<>
703 struct SHEAF_DLL_SPEC primitive_traits<long double>
704 {
705  typedef long double type;
706  static primitive_type id()
707  {
708  return LONG_DOUBLE;
709  };
710  static size_type size()
711  {
712  return sizeof(long double);
713  };
714  static size_type alignment()
715  {
716  struct alignment_type
717  {
718  char pad;
719  long double prim;
720  };
721  return offsetof(alignment_type, prim);
722  };
723  static const std::string& name()
724  {
725  static const std::string result("LONG_DOUBLE");
726  return result;
727  };
728  static const std::string& aliases()
729  {
730  static const std::string result;
731  return result;
732  };
733  static const std::string& hdf_type_name()
734  {
735  static const std::string result("SHF_PRIMITIVE_LONG_DOUBLE");
736  return result;
737  };
738  static int hdf_type();
739  static long double default_value()
740  {
741  return 0.0;
742  };
743 };
744 
745 template<>
746 struct SHEAF_DLL_SPEC primitive_traits<void_star>
747 {
748  typedef void_star type;
749  static primitive_type id()
750  {
751  return VOID_STAR;
752  };
753  static size_type size()
754  {
755  return sizeof(void_star);
756  };
757  static size_type alignment()
758  {
759  struct alignment_type
760  {
761  char pad;
762  void_star prim;
763  };
764  return offsetof(alignment_type, prim);
765  };
766  static const std::string& name()
767  {
768  static const std::string result("VOID_STAR");
769  return result;
770  };
771  static const std::string& aliases()
772  {
773  static const std::string result;
774  return result;
775  };
776  static const std::string& hdf_type_name()
777  {
778  static const std::string result("SHF_PRIMITIVE_VOID_STAR");
779  return result;
780  };
781  static int hdf_type();
782  static void_star default_value()
783  {
784  return 0;
785  };
786 };
787 
788 template<>
789 struct SHEAF_DLL_SPEC primitive_traits<c_string>
790 {
791  typedef c_string type;
792  static primitive_type id()
793  {
794  return C_STRING;
795  };
796  static size_type size()
797  {
798  return sizeof(c_string);
799  };
800  static size_type alignment()
801  {
802  struct alignment_type
803  {
804  char pad;
805  c_string prim;
806  };
807  return offsetof(alignment_type, prim);
808  };
809  static const std::string& name()
810  {
811  static const std::string result("C_STRING");
812  return result;
813  };
814  static const std::string& aliases()
815  {
816  static const std::string result;
817  return result;
818  };
819  static const std::string& hdf_type_name()
820  {
821  static const std::string result("SHF_PRIMITIVE_C_STRING");
822  return result;
823  };
824  static int hdf_type();
825  static c_string default_value()
826  {
827  return strdup("");
828  };
829 };
830 
831 template<>
832 struct SHEAF_DLL_SPEC primitive_traits<char const*>
833 {
834  typedef char const* type;
835  static primitive_type id()
836  {
837  return C_STRING;
838  };
839  static size_type size()
840  {
841  return sizeof(c_string);
842  };
843  static size_type alignment()
844  {
845  struct alignment_type
846  {
847  char pad;
848  char const* prim;
849  };
850  return offsetof(alignment_type, prim);
851  };
852  static const std::string& name()
853  {
854  static const std::string result("C_STRING");
855  return result;
856  };
857  static const std::string& aliases()
858  {
859  static const std::string result;
860  return result;
861  };
862  static const std::string& hdf_type_name()
863  {
864  static const std::string result("SHF_PRIMITIVE_C_STRING");
865  return result;
866  };
867  static int hdf_type();
868  static char const* default_value()
869  {
870  return strdup("");
871  };
872 };
873 
874 template<>
876 {
878  static primitive_type id()
879  {
880  return NAMESPACE_RELATIVE_MEMBER_INDEX;
881  };
882  static size_type size()
883  {
885  };
886  static size_type alignment()
887  {
888  struct alignment_type
889  {
890  char pad;
892  };
893  return offsetof(alignment_type, prim);
894  };
895  static const std::string& name()
896  {
897  static const std::string result("NAMESPACE_RELATIVE_MEMBER_INDEX");
898  return result;
899  };
900  static const std::string& aliases()
901  {
902  static const std::string result;
903  return result;
904  };
905  static const std::string& hdf_type_name()
906  {
907  static const std::string result("SHF_PRIMITIVE_NAMESPACE_RELATIVE_MEMBER_INDEX");
908  return result;
909  };
910  static int hdf_type();
911  static namespace_relative_member_index_pod_type default_value()
912  {
914  };
915 };
916 
917 template<>
919 {
921  static primitive_type id()
922  {
923  return NAMESPACE_RELATIVE_SUBPOSET_INDEX;
924  };
925  static size_type size()
926  {
928  };
929  static size_type alignment()
930  {
931  struct alignment_type
932  {
933  char pad;
935  };
936  return offsetof(alignment_type, prim);
937  };
938  static const std::string& name()
939  {
940  static const std::string result("NAMESPACE_RELATIVE_SUBPOSET_INDEX");
941  return result;
942  };
943  static const std::string& aliases()
944  {
945  static const std::string result;
946  return result;
947  };
948  static const std::string& hdf_type_name()
949  {
950  static const std::string result("SHF_PRIMITIVE_NAMESPACE_RELATIVE_SUBPOSET_INDEX");
951  return result;
952  };
953  static int hdf_type();
954  static namespace_relative_subposet_index_pod_type default_value()
955  {
957  };
958 };
959 
960 template<>
961 struct SHEAF_DLL_SPEC primitive_traits<void>
962 {
963  typedef void type;
964  static primitive_type id()
965  {
966  return NOT_A_PRIMITIVE_TYPE;
967  };
968  static size_type size()
969  {
970  return 0;
971  };
972  static size_type alignment()
973  {
974  return 0;
975  };
976  static const std::string& name()
977  {
978  static const std::string result("NOT_A_PRIMITIVE_TYPE");
979  return result;
980  };
981  static const std::string& aliases()
982  {
983  static const std::string result;
984  return result;
985  };
986  static const std::string& hdf_type_name()
987  {
988  static const std::string result;
989  return result;
990  };
991  static int hdf_type();
992  static primitive_buffer_type default_value()
993  {
995  for(int i=0; i<sizeof(lbuf); ++i)
996  {
997  reinterpret_cast<char*>(&lbuf)[i] = 0;
998  }
999  return lbuf;
1000  };
1001 };
1002 
1003 // ===========================================================
1004 // NON-MEMBER FUNCTIONS
1005 // ===========================================================
1006 
1007 } // namespace sheaf
1008 
1009 
1010 #endif // ifndef PRIMITIVE_TRAITS_H
T type
The primitive T.
SHEAF_DLL_SPEC namespace_relative_member_index_pod_type invalid_namespace_relative_member_index_pod()
The invalid namespace_relative_member_index_pod_type value.
Definition: pod_types.cc:55
SHEAF_DLL_SPEC namespace_relative_subposet_index_pod_type invalid_namespace_relative_subposet_index_pod()
The invalid namespace_relative_subposet_index_pod_type value.
Definition: pod_types.cc:80
void * void_star
Synonym for void*.
Definition: sheaf.h:57
primitive_type
Type ids for sheaf primitives.
Type of buffer large enough to hold any primitive type.
unsigned long size_type
An unsigned integral type used to represent sizes and capacities.
Definition: sheaf.h:52
POD type associated with namespace_relative_subposet_index.
Definition: pod_types.h:111
POD type for namespace_relative_member_index.
Definition: pod_types.h:79
Traits for primitive type T.
Namespace for the sheaves component of the sheaf system.
char * c_string
Synonym for char*.
Definition: sheaf.h:62