1 //
2 //! Copyright (c) 2011-2012
3 //! Brandon Kohn
4 //
5 //  Distributed under the Boost Software License, Version 1.0. (See
6 //  accompanying file LICENSE_1_0.txt or copy at
7 //  http://www.boost.org/LICENSE_1_0.txt)
8 //
9 
10 
11 
12 namespace boost { namespace numeric {
13 
14     template <>
15     struct numeric_cast_traits
16         <
17             char
18           , char
19         >
20     {
21         typedef def_overflow_handler overflow_policy;
22         typedef UseInternalRangeChecker range_checking_policy;
23         typedef Trunc<char> rounding_policy;
24     };
25 
26     template <>
27     struct numeric_cast_traits
28         <
29             char
30           , signed char
31         >
32     {
33         typedef def_overflow_handler overflow_policy;
34         typedef UseInternalRangeChecker range_checking_policy;
35         typedef Trunc<signed char> rounding_policy;
36     };
37 
38     template <>
39     struct numeric_cast_traits
40         <
41             char
42           , unsigned char
43         >
44     {
45         typedef def_overflow_handler overflow_policy;
46         typedef UseInternalRangeChecker range_checking_policy;
47         typedef Trunc<unsigned char> rounding_policy;
48     };
49 
50     template <>
51     struct numeric_cast_traits
52         <
53             char
54           , short
55         >
56     {
57         typedef def_overflow_handler overflow_policy;
58         typedef UseInternalRangeChecker range_checking_policy;
59         typedef Trunc<short> rounding_policy;
60     };
61 
62     template <>
63     struct numeric_cast_traits
64         <
65             char
66           , unsigned short
67         >
68     {
69         typedef def_overflow_handler overflow_policy;
70         typedef UseInternalRangeChecker range_checking_policy;
71         typedef Trunc<unsigned short> rounding_policy;
72     };
73 
74     template <>
75     struct numeric_cast_traits
76         <
77             char
78           , int
79         >
80     {
81         typedef def_overflow_handler overflow_policy;
82         typedef UseInternalRangeChecker range_checking_policy;
83         typedef Trunc<int> rounding_policy;
84     };
85 
86     template <>
87     struct numeric_cast_traits
88         <
89             char
90           , unsigned int
91         >
92     {
93         typedef def_overflow_handler overflow_policy;
94         typedef UseInternalRangeChecker range_checking_policy;
95         typedef Trunc<unsigned int> rounding_policy;
96     };
97 
98     template <>
99     struct numeric_cast_traits
100         <
101             char
102           , long
103         >
104     {
105         typedef def_overflow_handler overflow_policy;
106         typedef UseInternalRangeChecker range_checking_policy;
107         typedef Trunc<long> rounding_policy;
108     };
109 
110     template <>
111     struct numeric_cast_traits
112         <
113             char
114           , unsigned long
115         >
116     {
117         typedef def_overflow_handler overflow_policy;
118         typedef UseInternalRangeChecker range_checking_policy;
119         typedef Trunc<unsigned long> rounding_policy;
120     };
121 
122     template <>
123     struct numeric_cast_traits
124         <
125             char
126           , float
127         >
128     {
129         typedef def_overflow_handler overflow_policy;
130         typedef UseInternalRangeChecker range_checking_policy;
131         typedef Trunc<float> rounding_policy;
132     };
133 
134     template <>
135     struct numeric_cast_traits
136         <
137             char
138           , double
139         >
140     {
141         typedef def_overflow_handler overflow_policy;
142         typedef UseInternalRangeChecker range_checking_policy;
143         typedef Trunc<double> rounding_policy;
144     };
145 
146     template <>
147     struct numeric_cast_traits
148         <
149             char
150           , long double
151         >
152     {
153         typedef def_overflow_handler overflow_policy;
154         typedef UseInternalRangeChecker range_checking_policy;
155         typedef Trunc<long double> rounding_policy;
156     };
157 
158     template <>
159     struct numeric_cast_traits
160         <
161             signed char
162           , char
163         >
164     {
165         typedef def_overflow_handler overflow_policy;
166         typedef UseInternalRangeChecker range_checking_policy;
167         typedef Trunc<char> rounding_policy;
168     };
169 
170     template <>
171     struct numeric_cast_traits
172         <
173             signed char
174           , signed char
175         >
176     {
177         typedef def_overflow_handler overflow_policy;
178         typedef UseInternalRangeChecker range_checking_policy;
179         typedef Trunc<signed char> rounding_policy;
180     };
181 
182     template <>
183     struct numeric_cast_traits
184         <
185             signed char
186           , unsigned char
187         >
188     {
189         typedef def_overflow_handler overflow_policy;
190         typedef UseInternalRangeChecker range_checking_policy;
191         typedef Trunc<unsigned char> rounding_policy;
192     };
193 
194     template <>
195     struct numeric_cast_traits
196         <
197             signed char
198           , short
199         >
200     {
201         typedef def_overflow_handler overflow_policy;
202         typedef UseInternalRangeChecker range_checking_policy;
203         typedef Trunc<short> rounding_policy;
204     };
205 
206     template <>
207     struct numeric_cast_traits
208         <
209             signed char
210           , unsigned short
211         >
212     {
213         typedef def_overflow_handler overflow_policy;
214         typedef UseInternalRangeChecker range_checking_policy;
215         typedef Trunc<unsigned short> rounding_policy;
216     };
217 
218     template <>
219     struct numeric_cast_traits
220         <
221             signed char
222           , int
223         >
224     {
225         typedef def_overflow_handler overflow_policy;
226         typedef UseInternalRangeChecker range_checking_policy;
227         typedef Trunc<int> rounding_policy;
228     };
229 
230     template <>
231     struct numeric_cast_traits
232         <
233             signed char
234           , unsigned int
235         >
236     {
237         typedef def_overflow_handler overflow_policy;
238         typedef UseInternalRangeChecker range_checking_policy;
239         typedef Trunc<unsigned int> rounding_policy;
240     };
241 
242     template <>
243     struct numeric_cast_traits
244         <
245             signed char
246           , long
247         >
248     {
249         typedef def_overflow_handler overflow_policy;
250         typedef UseInternalRangeChecker range_checking_policy;
251         typedef Trunc<long> rounding_policy;
252     };
253 
254     template <>
255     struct numeric_cast_traits
256         <
257             signed char
258           , unsigned long
259         >
260     {
261         typedef def_overflow_handler overflow_policy;
262         typedef UseInternalRangeChecker range_checking_policy;
263         typedef Trunc<unsigned long> rounding_policy;
264     };
265 
266     template <>
267     struct numeric_cast_traits
268         <
269             signed char
270           , float
271         >
272     {
273         typedef def_overflow_handler overflow_policy;
274         typedef UseInternalRangeChecker range_checking_policy;
275         typedef Trunc<float> rounding_policy;
276     };
277 
278     template <>
279     struct numeric_cast_traits
280         <
281             signed char
282           , double
283         >
284     {
285         typedef def_overflow_handler overflow_policy;
286         typedef UseInternalRangeChecker range_checking_policy;
287         typedef Trunc<double> rounding_policy;
288     };
289 
290     template <>
291     struct numeric_cast_traits
292         <
293             signed char
294           , long double
295         >
296     {
297         typedef def_overflow_handler overflow_policy;
298         typedef UseInternalRangeChecker range_checking_policy;
299         typedef Trunc<long double> rounding_policy;
300     };
301 
302     template <>
303     struct numeric_cast_traits
304         <
305             unsigned char
306           , char
307         >
308     {
309         typedef def_overflow_handler overflow_policy;
310         typedef UseInternalRangeChecker range_checking_policy;
311         typedef Trunc<char> rounding_policy;
312     };
313 
314     template <>
315     struct numeric_cast_traits
316         <
317             unsigned char
318           , signed char
319         >
320     {
321         typedef def_overflow_handler overflow_policy;
322         typedef UseInternalRangeChecker range_checking_policy;
323         typedef Trunc<signed char> rounding_policy;
324     };
325 
326     template <>
327     struct numeric_cast_traits
328         <
329             unsigned char
330           , unsigned char
331         >
332     {
333         typedef def_overflow_handler overflow_policy;
334         typedef UseInternalRangeChecker range_checking_policy;
335         typedef Trunc<unsigned char> rounding_policy;
336     };
337 
338     template <>
339     struct numeric_cast_traits
340         <
341             unsigned char
342           , short
343         >
344     {
345         typedef def_overflow_handler overflow_policy;
346         typedef UseInternalRangeChecker range_checking_policy;
347         typedef Trunc<short> rounding_policy;
348     };
349 
350     template <>
351     struct numeric_cast_traits
352         <
353             unsigned char
354           , unsigned short
355         >
356     {
357         typedef def_overflow_handler overflow_policy;
358         typedef UseInternalRangeChecker range_checking_policy;
359         typedef Trunc<unsigned short> rounding_policy;
360     };
361 
362     template <>
363     struct numeric_cast_traits
364         <
365             unsigned char
366           , int
367         >
368     {
369         typedef def_overflow_handler overflow_policy;
370         typedef UseInternalRangeChecker range_checking_policy;
371         typedef Trunc<int> rounding_policy;
372     };
373 
374     template <>
375     struct numeric_cast_traits
376         <
377             unsigned char
378           , unsigned int
379         >
380     {
381         typedef def_overflow_handler overflow_policy;
382         typedef UseInternalRangeChecker range_checking_policy;
383         typedef Trunc<unsigned int> rounding_policy;
384     };
385 
386     template <>
387     struct numeric_cast_traits
388         <
389             unsigned char
390           , long
391         >
392     {
393         typedef def_overflow_handler overflow_policy;
394         typedef UseInternalRangeChecker range_checking_policy;
395         typedef Trunc<long> rounding_policy;
396     };
397 
398     template <>
399     struct numeric_cast_traits
400         <
401             unsigned char
402           , unsigned long
403         >
404     {
405         typedef def_overflow_handler overflow_policy;
406         typedef UseInternalRangeChecker range_checking_policy;
407         typedef Trunc<unsigned long> rounding_policy;
408     };
409 
410     template <>
411     struct numeric_cast_traits
412         <
413             unsigned char
414           , float
415         >
416     {
417         typedef def_overflow_handler overflow_policy;
418         typedef UseInternalRangeChecker range_checking_policy;
419         typedef Trunc<float> rounding_policy;
420     };
421 
422     template <>
423     struct numeric_cast_traits
424         <
425             unsigned char
426           , double
427         >
428     {
429         typedef def_overflow_handler overflow_policy;
430         typedef UseInternalRangeChecker range_checking_policy;
431         typedef Trunc<double> rounding_policy;
432     };
433 
434     template <>
435     struct numeric_cast_traits
436         <
437             unsigned char
438           , long double
439         >
440     {
441         typedef def_overflow_handler overflow_policy;
442         typedef UseInternalRangeChecker range_checking_policy;
443         typedef Trunc<long double> rounding_policy;
444     };
445 
446     template <>
447     struct numeric_cast_traits
448         <
449             short
450           , char
451         >
452     {
453         typedef def_overflow_handler overflow_policy;
454         typedef UseInternalRangeChecker range_checking_policy;
455         typedef Trunc<char> rounding_policy;
456     };
457 
458     template <>
459     struct numeric_cast_traits
460         <
461             short
462           , signed char
463         >
464     {
465         typedef def_overflow_handler overflow_policy;
466         typedef UseInternalRangeChecker range_checking_policy;
467         typedef Trunc<signed char> rounding_policy;
468     };
469 
470     template <>
471     struct numeric_cast_traits
472         <
473             short
474           , unsigned char
475         >
476     {
477         typedef def_overflow_handler overflow_policy;
478         typedef UseInternalRangeChecker range_checking_policy;
479         typedef Trunc<unsigned char> rounding_policy;
480     };
481 
482     template <>
483     struct numeric_cast_traits
484         <
485             short
486           , short
487         >
488     {
489         typedef def_overflow_handler overflow_policy;
490         typedef UseInternalRangeChecker range_checking_policy;
491         typedef Trunc<short> rounding_policy;
492     };
493 
494     template <>
495     struct numeric_cast_traits
496         <
497             short
498           , unsigned short
499         >
500     {
501         typedef def_overflow_handler overflow_policy;
502         typedef UseInternalRangeChecker range_checking_policy;
503         typedef Trunc<unsigned short> rounding_policy;
504     };
505 
506     template <>
507     struct numeric_cast_traits
508         <
509             short
510           , int
511         >
512     {
513         typedef def_overflow_handler overflow_policy;
514         typedef UseInternalRangeChecker range_checking_policy;
515         typedef Trunc<int> rounding_policy;
516     };
517 
518     template <>
519     struct numeric_cast_traits
520         <
521             short
522           , unsigned int
523         >
524     {
525         typedef def_overflow_handler overflow_policy;
526         typedef UseInternalRangeChecker range_checking_policy;
527         typedef Trunc<unsigned int> rounding_policy;
528     };
529 
530     template <>
531     struct numeric_cast_traits
532         <
533             short
534           , long
535         >
536     {
537         typedef def_overflow_handler overflow_policy;
538         typedef UseInternalRangeChecker range_checking_policy;
539         typedef Trunc<long> rounding_policy;
540     };
541 
542     template <>
543     struct numeric_cast_traits
544         <
545             short
546           , unsigned long
547         >
548     {
549         typedef def_overflow_handler overflow_policy;
550         typedef UseInternalRangeChecker range_checking_policy;
551         typedef Trunc<unsigned long> rounding_policy;
552     };
553 
554     template <>
555     struct numeric_cast_traits
556         <
557             short
558           , float
559         >
560     {
561         typedef def_overflow_handler overflow_policy;
562         typedef UseInternalRangeChecker range_checking_policy;
563         typedef Trunc<float> rounding_policy;
564     };
565 
566     template <>
567     struct numeric_cast_traits
568         <
569             short
570           , double
571         >
572     {
573         typedef def_overflow_handler overflow_policy;
574         typedef UseInternalRangeChecker range_checking_policy;
575         typedef Trunc<double> rounding_policy;
576     };
577 
578     template <>
579     struct numeric_cast_traits
580         <
581             short
582           , long double
583         >
584     {
585         typedef def_overflow_handler overflow_policy;
586         typedef UseInternalRangeChecker range_checking_policy;
587         typedef Trunc<long double> rounding_policy;
588     };
589 
590     template <>
591     struct numeric_cast_traits
592         <
593             unsigned short
594           , char
595         >
596     {
597         typedef def_overflow_handler overflow_policy;
598         typedef UseInternalRangeChecker range_checking_policy;
599         typedef Trunc<char> rounding_policy;
600     };
601 
602     template <>
603     struct numeric_cast_traits
604         <
605             unsigned short
606           , signed char
607         >
608     {
609         typedef def_overflow_handler overflow_policy;
610         typedef UseInternalRangeChecker range_checking_policy;
611         typedef Trunc<signed char> rounding_policy;
612     };
613 
614     template <>
615     struct numeric_cast_traits
616         <
617             unsigned short
618           , unsigned char
619         >
620     {
621         typedef def_overflow_handler overflow_policy;
622         typedef UseInternalRangeChecker range_checking_policy;
623         typedef Trunc<unsigned char> rounding_policy;
624     };
625 
626     template <>
627     struct numeric_cast_traits
628         <
629             unsigned short
630           , short
631         >
632     {
633         typedef def_overflow_handler overflow_policy;
634         typedef UseInternalRangeChecker range_checking_policy;
635         typedef Trunc<short> rounding_policy;
636     };
637 
638     template <>
639     struct numeric_cast_traits
640         <
641             unsigned short
642           , unsigned short
643         >
644     {
645         typedef def_overflow_handler overflow_policy;
646         typedef UseInternalRangeChecker range_checking_policy;
647         typedef Trunc<unsigned short> rounding_policy;
648     };
649 
650     template <>
651     struct numeric_cast_traits
652         <
653             unsigned short
654           , int
655         >
656     {
657         typedef def_overflow_handler overflow_policy;
658         typedef UseInternalRangeChecker range_checking_policy;
659         typedef Trunc<int> rounding_policy;
660     };
661 
662     template <>
663     struct numeric_cast_traits
664         <
665             unsigned short
666           , unsigned int
667         >
668     {
669         typedef def_overflow_handler overflow_policy;
670         typedef UseInternalRangeChecker range_checking_policy;
671         typedef Trunc<unsigned int> rounding_policy;
672     };
673 
674     template <>
675     struct numeric_cast_traits
676         <
677             unsigned short
678           , long
679         >
680     {
681         typedef def_overflow_handler overflow_policy;
682         typedef UseInternalRangeChecker range_checking_policy;
683         typedef Trunc<long> rounding_policy;
684     };
685 
686     template <>
687     struct numeric_cast_traits
688         <
689             unsigned short
690           , unsigned long
691         >
692     {
693         typedef def_overflow_handler overflow_policy;
694         typedef UseInternalRangeChecker range_checking_policy;
695         typedef Trunc<unsigned long> rounding_policy;
696     };
697 
698     template <>
699     struct numeric_cast_traits
700         <
701             unsigned short
702           , float
703         >
704     {
705         typedef def_overflow_handler overflow_policy;
706         typedef UseInternalRangeChecker range_checking_policy;
707         typedef Trunc<float> rounding_policy;
708     };
709 
710     template <>
711     struct numeric_cast_traits
712         <
713             unsigned short
714           , double
715         >
716     {
717         typedef def_overflow_handler overflow_policy;
718         typedef UseInternalRangeChecker range_checking_policy;
719         typedef Trunc<double> rounding_policy;
720     };
721 
722     template <>
723     struct numeric_cast_traits
724         <
725             unsigned short
726           , long double
727         >
728     {
729         typedef def_overflow_handler overflow_policy;
730         typedef UseInternalRangeChecker range_checking_policy;
731         typedef Trunc<long double> rounding_policy;
732     };
733 
734     template <>
735     struct numeric_cast_traits
736         <
737             int
738           , char
739         >
740     {
741         typedef def_overflow_handler overflow_policy;
742         typedef UseInternalRangeChecker range_checking_policy;
743         typedef Trunc<char> rounding_policy;
744     };
745 
746     template <>
747     struct numeric_cast_traits
748         <
749             int
750           , signed char
751         >
752     {
753         typedef def_overflow_handler overflow_policy;
754         typedef UseInternalRangeChecker range_checking_policy;
755         typedef Trunc<signed char> rounding_policy;
756     };
757 
758     template <>
759     struct numeric_cast_traits
760         <
761             int
762           , unsigned char
763         >
764     {
765         typedef def_overflow_handler overflow_policy;
766         typedef UseInternalRangeChecker range_checking_policy;
767         typedef Trunc<unsigned char> rounding_policy;
768     };
769 
770     template <>
771     struct numeric_cast_traits
772         <
773             int
774           , short
775         >
776     {
777         typedef def_overflow_handler overflow_policy;
778         typedef UseInternalRangeChecker range_checking_policy;
779         typedef Trunc<short> rounding_policy;
780     };
781 
782     template <>
783     struct numeric_cast_traits
784         <
785             int
786           , unsigned short
787         >
788     {
789         typedef def_overflow_handler overflow_policy;
790         typedef UseInternalRangeChecker range_checking_policy;
791         typedef Trunc<unsigned short> rounding_policy;
792     };
793 
794     template <>
795     struct numeric_cast_traits
796         <
797             int
798           , int
799         >
800     {
801         typedef def_overflow_handler overflow_policy;
802         typedef UseInternalRangeChecker range_checking_policy;
803         typedef Trunc<int> rounding_policy;
804     };
805 
806     template <>
807     struct numeric_cast_traits
808         <
809             int
810           , unsigned int
811         >
812     {
813         typedef def_overflow_handler overflow_policy;
814         typedef UseInternalRangeChecker range_checking_policy;
815         typedef Trunc<unsigned int> rounding_policy;
816     };
817 
818     template <>
819     struct numeric_cast_traits
820         <
821             int
822           , long
823         >
824     {
825         typedef def_overflow_handler overflow_policy;
826         typedef UseInternalRangeChecker range_checking_policy;
827         typedef Trunc<long> rounding_policy;
828     };
829 
830     template <>
831     struct numeric_cast_traits
832         <
833             int
834           , unsigned long
835         >
836     {
837         typedef def_overflow_handler overflow_policy;
838         typedef UseInternalRangeChecker range_checking_policy;
839         typedef Trunc<unsigned long> rounding_policy;
840     };
841 
842     template <>
843     struct numeric_cast_traits
844         <
845             int
846           , float
847         >
848     {
849         typedef def_overflow_handler overflow_policy;
850         typedef UseInternalRangeChecker range_checking_policy;
851         typedef Trunc<float> rounding_policy;
852     };
853 
854     template <>
855     struct numeric_cast_traits
856         <
857             int
858           , double
859         >
860     {
861         typedef def_overflow_handler overflow_policy;
862         typedef UseInternalRangeChecker range_checking_policy;
863         typedef Trunc<double> rounding_policy;
864     };
865 
866     template <>
867     struct numeric_cast_traits
868         <
869             int
870           , long double
871         >
872     {
873         typedef def_overflow_handler overflow_policy;
874         typedef UseInternalRangeChecker range_checking_policy;
875         typedef Trunc<long double> rounding_policy;
876     };
877 
878     template <>
879     struct numeric_cast_traits
880         <
881             unsigned int
882           , char
883         >
884     {
885         typedef def_overflow_handler overflow_policy;
886         typedef UseInternalRangeChecker range_checking_policy;
887         typedef Trunc<char> rounding_policy;
888     };
889 
890     template <>
891     struct numeric_cast_traits
892         <
893             unsigned int
894           , signed char
895         >
896     {
897         typedef def_overflow_handler overflow_policy;
898         typedef UseInternalRangeChecker range_checking_policy;
899         typedef Trunc<signed char> rounding_policy;
900     };
901 
902     template <>
903     struct numeric_cast_traits
904         <
905             unsigned int
906           , unsigned char
907         >
908     {
909         typedef def_overflow_handler overflow_policy;
910         typedef UseInternalRangeChecker range_checking_policy;
911         typedef Trunc<unsigned char> rounding_policy;
912     };
913 
914     template <>
915     struct numeric_cast_traits
916         <
917             unsigned int
918           , short
919         >
920     {
921         typedef def_overflow_handler overflow_policy;
922         typedef UseInternalRangeChecker range_checking_policy;
923         typedef Trunc<short> rounding_policy;
924     };
925 
926     template <>
927     struct numeric_cast_traits
928         <
929             unsigned int
930           , unsigned short
931         >
932     {
933         typedef def_overflow_handler overflow_policy;
934         typedef UseInternalRangeChecker range_checking_policy;
935         typedef Trunc<unsigned short> rounding_policy;
936     };
937 
938     template <>
939     struct numeric_cast_traits
940         <
941             unsigned int
942           , int
943         >
944     {
945         typedef def_overflow_handler overflow_policy;
946         typedef UseInternalRangeChecker range_checking_policy;
947         typedef Trunc<int> rounding_policy;
948     };
949 
950     template <>
951     struct numeric_cast_traits
952         <
953             unsigned int
954           , unsigned int
955         >
956     {
957         typedef def_overflow_handler overflow_policy;
958         typedef UseInternalRangeChecker range_checking_policy;
959         typedef Trunc<unsigned int> rounding_policy;
960     };
961 
962     template <>
963     struct numeric_cast_traits
964         <
965             unsigned int
966           , long
967         >
968     {
969         typedef def_overflow_handler overflow_policy;
970         typedef UseInternalRangeChecker range_checking_policy;
971         typedef Trunc<long> rounding_policy;
972     };
973 
974     template <>
975     struct numeric_cast_traits
976         <
977             unsigned int
978           , unsigned long
979         >
980     {
981         typedef def_overflow_handler overflow_policy;
982         typedef UseInternalRangeChecker range_checking_policy;
983         typedef Trunc<unsigned long> rounding_policy;
984     };
985 
986     template <>
987     struct numeric_cast_traits
988         <
989             unsigned int
990           , float
991         >
992     {
993         typedef def_overflow_handler overflow_policy;
994         typedef UseInternalRangeChecker range_checking_policy;
995         typedef Trunc<float> rounding_policy;
996     };
997 
998     template <>
999     struct numeric_cast_traits
1000         <
1001             unsigned int
1002           , double
1003         >
1004     {
1005         typedef def_overflow_handler overflow_policy;
1006         typedef UseInternalRangeChecker range_checking_policy;
1007         typedef Trunc<double> rounding_policy;
1008     };
1009 
1010     template <>
1011     struct numeric_cast_traits
1012         <
1013             unsigned int
1014           , long double
1015         >
1016     {
1017         typedef def_overflow_handler overflow_policy;
1018         typedef UseInternalRangeChecker range_checking_policy;
1019         typedef Trunc<long double> rounding_policy;
1020     };
1021 
1022     template <>
1023     struct numeric_cast_traits
1024         <
1025             long
1026           , char
1027         >
1028     {
1029         typedef def_overflow_handler overflow_policy;
1030         typedef UseInternalRangeChecker range_checking_policy;
1031         typedef Trunc<char> rounding_policy;
1032     };
1033 
1034     template <>
1035     struct numeric_cast_traits
1036         <
1037             long
1038           , signed char
1039         >
1040     {
1041         typedef def_overflow_handler overflow_policy;
1042         typedef UseInternalRangeChecker range_checking_policy;
1043         typedef Trunc<signed char> rounding_policy;
1044     };
1045 
1046     template <>
1047     struct numeric_cast_traits
1048         <
1049             long
1050           , unsigned char
1051         >
1052     {
1053         typedef def_overflow_handler overflow_policy;
1054         typedef UseInternalRangeChecker range_checking_policy;
1055         typedef Trunc<unsigned char> rounding_policy;
1056     };
1057 
1058     template <>
1059     struct numeric_cast_traits
1060         <
1061             long
1062           , short
1063         >
1064     {
1065         typedef def_overflow_handler overflow_policy;
1066         typedef UseInternalRangeChecker range_checking_policy;
1067         typedef Trunc<short> rounding_policy;
1068     };
1069 
1070     template <>
1071     struct numeric_cast_traits
1072         <
1073             long
1074           , unsigned short
1075         >
1076     {
1077         typedef def_overflow_handler overflow_policy;
1078         typedef UseInternalRangeChecker range_checking_policy;
1079         typedef Trunc<unsigned short> rounding_policy;
1080     };
1081 
1082     template <>
1083     struct numeric_cast_traits
1084         <
1085             long
1086           , int
1087         >
1088     {
1089         typedef def_overflow_handler overflow_policy;
1090         typedef UseInternalRangeChecker range_checking_policy;
1091         typedef Trunc<int> rounding_policy;
1092     };
1093 
1094     template <>
1095     struct numeric_cast_traits
1096         <
1097             long
1098           , unsigned int
1099         >
1100     {
1101         typedef def_overflow_handler overflow_policy;
1102         typedef UseInternalRangeChecker range_checking_policy;
1103         typedef Trunc<unsigned int> rounding_policy;
1104     };
1105 
1106     template <>
1107     struct numeric_cast_traits
1108         <
1109             long
1110           , long
1111         >
1112     {
1113         typedef def_overflow_handler overflow_policy;
1114         typedef UseInternalRangeChecker range_checking_policy;
1115         typedef Trunc<long> rounding_policy;
1116     };
1117 
1118     template <>
1119     struct numeric_cast_traits
1120         <
1121             long
1122           , unsigned long
1123         >
1124     {
1125         typedef def_overflow_handler overflow_policy;
1126         typedef UseInternalRangeChecker range_checking_policy;
1127         typedef Trunc<unsigned long> rounding_policy;
1128     };
1129 
1130     template <>
1131     struct numeric_cast_traits
1132         <
1133             long
1134           , float
1135         >
1136     {
1137         typedef def_overflow_handler overflow_policy;
1138         typedef UseInternalRangeChecker range_checking_policy;
1139         typedef Trunc<float> rounding_policy;
1140     };
1141 
1142     template <>
1143     struct numeric_cast_traits
1144         <
1145             long
1146           , double
1147         >
1148     {
1149         typedef def_overflow_handler overflow_policy;
1150         typedef UseInternalRangeChecker range_checking_policy;
1151         typedef Trunc<double> rounding_policy;
1152     };
1153 
1154     template <>
1155     struct numeric_cast_traits
1156         <
1157             long
1158           , long double
1159         >
1160     {
1161         typedef def_overflow_handler overflow_policy;
1162         typedef UseInternalRangeChecker range_checking_policy;
1163         typedef Trunc<long double> rounding_policy;
1164     };
1165 
1166     template <>
1167     struct numeric_cast_traits
1168         <
1169             unsigned long
1170           , char
1171         >
1172     {
1173         typedef def_overflow_handler overflow_policy;
1174         typedef UseInternalRangeChecker range_checking_policy;
1175         typedef Trunc<char> rounding_policy;
1176     };
1177 
1178     template <>
1179     struct numeric_cast_traits
1180         <
1181             unsigned long
1182           , signed char
1183         >
1184     {
1185         typedef def_overflow_handler overflow_policy;
1186         typedef UseInternalRangeChecker range_checking_policy;
1187         typedef Trunc<signed char> rounding_policy;
1188     };
1189 
1190     template <>
1191     struct numeric_cast_traits
1192         <
1193             unsigned long
1194           , unsigned char
1195         >
1196     {
1197         typedef def_overflow_handler overflow_policy;
1198         typedef UseInternalRangeChecker range_checking_policy;
1199         typedef Trunc<unsigned char> rounding_policy;
1200     };
1201 
1202     template <>
1203     struct numeric_cast_traits
1204         <
1205             unsigned long
1206           , short
1207         >
1208     {
1209         typedef def_overflow_handler overflow_policy;
1210         typedef UseInternalRangeChecker range_checking_policy;
1211         typedef Trunc<short> rounding_policy;
1212     };
1213 
1214     template <>
1215     struct numeric_cast_traits
1216         <
1217             unsigned long
1218           , unsigned short
1219         >
1220     {
1221         typedef def_overflow_handler overflow_policy;
1222         typedef UseInternalRangeChecker range_checking_policy;
1223         typedef Trunc<unsigned short> rounding_policy;
1224     };
1225 
1226     template <>
1227     struct numeric_cast_traits
1228         <
1229             unsigned long
1230           , int
1231         >
1232     {
1233         typedef def_overflow_handler overflow_policy;
1234         typedef UseInternalRangeChecker range_checking_policy;
1235         typedef Trunc<int> rounding_policy;
1236     };
1237 
1238     template <>
1239     struct numeric_cast_traits
1240         <
1241             unsigned long
1242           , unsigned int
1243         >
1244     {
1245         typedef def_overflow_handler overflow_policy;
1246         typedef UseInternalRangeChecker range_checking_policy;
1247         typedef Trunc<unsigned int> rounding_policy;
1248     };
1249 
1250     template <>
1251     struct numeric_cast_traits
1252         <
1253             unsigned long
1254           , long
1255         >
1256     {
1257         typedef def_overflow_handler overflow_policy;
1258         typedef UseInternalRangeChecker range_checking_policy;
1259         typedef Trunc<long> rounding_policy;
1260     };
1261 
1262     template <>
1263     struct numeric_cast_traits
1264         <
1265             unsigned long
1266           , unsigned long
1267         >
1268     {
1269         typedef def_overflow_handler overflow_policy;
1270         typedef UseInternalRangeChecker range_checking_policy;
1271         typedef Trunc<unsigned long> rounding_policy;
1272     };
1273 
1274     template <>
1275     struct numeric_cast_traits
1276         <
1277             unsigned long
1278           , float
1279         >
1280     {
1281         typedef def_overflow_handler overflow_policy;
1282         typedef UseInternalRangeChecker range_checking_policy;
1283         typedef Trunc<float> rounding_policy;
1284     };
1285 
1286     template <>
1287     struct numeric_cast_traits
1288         <
1289             unsigned long
1290           , double
1291         >
1292     {
1293         typedef def_overflow_handler overflow_policy;
1294         typedef UseInternalRangeChecker range_checking_policy;
1295         typedef Trunc<double> rounding_policy;
1296     };
1297 
1298     template <>
1299     struct numeric_cast_traits
1300         <
1301             unsigned long
1302           , long double
1303         >
1304     {
1305         typedef def_overflow_handler overflow_policy;
1306         typedef UseInternalRangeChecker range_checking_policy;
1307         typedef Trunc<long double> rounding_policy;
1308     };
1309 
1310     template <>
1311     struct numeric_cast_traits
1312         <
1313             float
1314           , char
1315         >
1316     {
1317         typedef def_overflow_handler overflow_policy;
1318         typedef UseInternalRangeChecker range_checking_policy;
1319         typedef Trunc<char> rounding_policy;
1320     };
1321 
1322     template <>
1323     struct numeric_cast_traits
1324         <
1325             float
1326           , signed char
1327         >
1328     {
1329         typedef def_overflow_handler overflow_policy;
1330         typedef UseInternalRangeChecker range_checking_policy;
1331         typedef Trunc<signed char> rounding_policy;
1332     };
1333 
1334     template <>
1335     struct numeric_cast_traits
1336         <
1337             float
1338           , unsigned char
1339         >
1340     {
1341         typedef def_overflow_handler overflow_policy;
1342         typedef UseInternalRangeChecker range_checking_policy;
1343         typedef Trunc<unsigned char> rounding_policy;
1344     };
1345 
1346     template <>
1347     struct numeric_cast_traits
1348         <
1349             float
1350           , short
1351         >
1352     {
1353         typedef def_overflow_handler overflow_policy;
1354         typedef UseInternalRangeChecker range_checking_policy;
1355         typedef Trunc<short> rounding_policy;
1356     };
1357 
1358     template <>
1359     struct numeric_cast_traits
1360         <
1361             float
1362           , unsigned short
1363         >
1364     {
1365         typedef def_overflow_handler overflow_policy;
1366         typedef UseInternalRangeChecker range_checking_policy;
1367         typedef Trunc<unsigned short> rounding_policy;
1368     };
1369 
1370     template <>
1371     struct numeric_cast_traits
1372         <
1373             float
1374           , int
1375         >
1376     {
1377         typedef def_overflow_handler overflow_policy;
1378         typedef UseInternalRangeChecker range_checking_policy;
1379         typedef Trunc<int> rounding_policy;
1380     };
1381 
1382     template <>
1383     struct numeric_cast_traits
1384         <
1385             float
1386           , unsigned int
1387         >
1388     {
1389         typedef def_overflow_handler overflow_policy;
1390         typedef UseInternalRangeChecker range_checking_policy;
1391         typedef Trunc<unsigned int> rounding_policy;
1392     };
1393 
1394     template <>
1395     struct numeric_cast_traits
1396         <
1397             float
1398           , long
1399         >
1400     {
1401         typedef def_overflow_handler overflow_policy;
1402         typedef UseInternalRangeChecker range_checking_policy;
1403         typedef Trunc<long> rounding_policy;
1404     };
1405 
1406     template <>
1407     struct numeric_cast_traits
1408         <
1409             float
1410           , unsigned long
1411         >
1412     {
1413         typedef def_overflow_handler overflow_policy;
1414         typedef UseInternalRangeChecker range_checking_policy;
1415         typedef Trunc<unsigned long> rounding_policy;
1416     };
1417 
1418     template <>
1419     struct numeric_cast_traits
1420         <
1421             float
1422           , float
1423         >
1424     {
1425         typedef def_overflow_handler overflow_policy;
1426         typedef UseInternalRangeChecker range_checking_policy;
1427         typedef Trunc<float> rounding_policy;
1428     };
1429 
1430     template <>
1431     struct numeric_cast_traits
1432         <
1433             float
1434           , double
1435         >
1436     {
1437         typedef def_overflow_handler overflow_policy;
1438         typedef UseInternalRangeChecker range_checking_policy;
1439         typedef Trunc<double> rounding_policy;
1440     };
1441 
1442     template <>
1443     struct numeric_cast_traits
1444         <
1445             float
1446           , long double
1447         >
1448     {
1449         typedef def_overflow_handler overflow_policy;
1450         typedef UseInternalRangeChecker range_checking_policy;
1451         typedef Trunc<long double> rounding_policy;
1452     };
1453 
1454     template <>
1455     struct numeric_cast_traits
1456         <
1457             double
1458           , char
1459         >
1460     {
1461         typedef def_overflow_handler overflow_policy;
1462         typedef UseInternalRangeChecker range_checking_policy;
1463         typedef Trunc<char> rounding_policy;
1464     };
1465 
1466     template <>
1467     struct numeric_cast_traits
1468         <
1469             double
1470           , signed char
1471         >
1472     {
1473         typedef def_overflow_handler overflow_policy;
1474         typedef UseInternalRangeChecker range_checking_policy;
1475         typedef Trunc<signed char> rounding_policy;
1476     };
1477 
1478     template <>
1479     struct numeric_cast_traits
1480         <
1481             double
1482           , unsigned char
1483         >
1484     {
1485         typedef def_overflow_handler overflow_policy;
1486         typedef UseInternalRangeChecker range_checking_policy;
1487         typedef Trunc<unsigned char> rounding_policy;
1488     };
1489 
1490     template <>
1491     struct numeric_cast_traits
1492         <
1493             double
1494           , short
1495         >
1496     {
1497         typedef def_overflow_handler overflow_policy;
1498         typedef UseInternalRangeChecker range_checking_policy;
1499         typedef Trunc<short> rounding_policy;
1500     };
1501 
1502     template <>
1503     struct numeric_cast_traits
1504         <
1505             double
1506           , unsigned short
1507         >
1508     {
1509         typedef def_overflow_handler overflow_policy;
1510         typedef UseInternalRangeChecker range_checking_policy;
1511         typedef Trunc<unsigned short> rounding_policy;
1512     };
1513 
1514     template <>
1515     struct numeric_cast_traits
1516         <
1517             double
1518           , int
1519         >
1520     {
1521         typedef def_overflow_handler overflow_policy;
1522         typedef UseInternalRangeChecker range_checking_policy;
1523         typedef Trunc<int> rounding_policy;
1524     };
1525 
1526     template <>
1527     struct numeric_cast_traits
1528         <
1529             double
1530           , unsigned int
1531         >
1532     {
1533         typedef def_overflow_handler overflow_policy;
1534         typedef UseInternalRangeChecker range_checking_policy;
1535         typedef Trunc<unsigned int> rounding_policy;
1536     };
1537 
1538     template <>
1539     struct numeric_cast_traits
1540         <
1541             double
1542           , long
1543         >
1544     {
1545         typedef def_overflow_handler overflow_policy;
1546         typedef UseInternalRangeChecker range_checking_policy;
1547         typedef Trunc<long> rounding_policy;
1548     };
1549 
1550     template <>
1551     struct numeric_cast_traits
1552         <
1553             double
1554           , unsigned long
1555         >
1556     {
1557         typedef def_overflow_handler overflow_policy;
1558         typedef UseInternalRangeChecker range_checking_policy;
1559         typedef Trunc<unsigned long> rounding_policy;
1560     };
1561 
1562     template <>
1563     struct numeric_cast_traits
1564         <
1565             double
1566           , float
1567         >
1568     {
1569         typedef def_overflow_handler overflow_policy;
1570         typedef UseInternalRangeChecker range_checking_policy;
1571         typedef Trunc<float> rounding_policy;
1572     };
1573 
1574     template <>
1575     struct numeric_cast_traits
1576         <
1577             double
1578           , double
1579         >
1580     {
1581         typedef def_overflow_handler overflow_policy;
1582         typedef UseInternalRangeChecker range_checking_policy;
1583         typedef Trunc<double> rounding_policy;
1584     };
1585 
1586     template <>
1587     struct numeric_cast_traits
1588         <
1589             double
1590           , long double
1591         >
1592     {
1593         typedef def_overflow_handler overflow_policy;
1594         typedef UseInternalRangeChecker range_checking_policy;
1595         typedef Trunc<long double> rounding_policy;
1596     };
1597 
1598     template <>
1599     struct numeric_cast_traits
1600         <
1601             long double
1602           , char
1603         >
1604     {
1605         typedef def_overflow_handler overflow_policy;
1606         typedef UseInternalRangeChecker range_checking_policy;
1607         typedef Trunc<char> rounding_policy;
1608     };
1609 
1610     template <>
1611     struct numeric_cast_traits
1612         <
1613             long double
1614           , signed char
1615         >
1616     {
1617         typedef def_overflow_handler overflow_policy;
1618         typedef UseInternalRangeChecker range_checking_policy;
1619         typedef Trunc<signed char> rounding_policy;
1620     };
1621 
1622     template <>
1623     struct numeric_cast_traits
1624         <
1625             long double
1626           , unsigned char
1627         >
1628     {
1629         typedef def_overflow_handler overflow_policy;
1630         typedef UseInternalRangeChecker range_checking_policy;
1631         typedef Trunc<unsigned char> rounding_policy;
1632     };
1633 
1634     template <>
1635     struct numeric_cast_traits
1636         <
1637             long double
1638           , short
1639         >
1640     {
1641         typedef def_overflow_handler overflow_policy;
1642         typedef UseInternalRangeChecker range_checking_policy;
1643         typedef Trunc<short> rounding_policy;
1644     };
1645 
1646     template <>
1647     struct numeric_cast_traits
1648         <
1649             long double
1650           , unsigned short
1651         >
1652     {
1653         typedef def_overflow_handler overflow_policy;
1654         typedef UseInternalRangeChecker range_checking_policy;
1655         typedef Trunc<unsigned short> rounding_policy;
1656     };
1657 
1658     template <>
1659     struct numeric_cast_traits
1660         <
1661             long double
1662           , int
1663         >
1664     {
1665         typedef def_overflow_handler overflow_policy;
1666         typedef UseInternalRangeChecker range_checking_policy;
1667         typedef Trunc<int> rounding_policy;
1668     };
1669 
1670     template <>
1671     struct numeric_cast_traits
1672         <
1673             long double
1674           , unsigned int
1675         >
1676     {
1677         typedef def_overflow_handler overflow_policy;
1678         typedef UseInternalRangeChecker range_checking_policy;
1679         typedef Trunc<unsigned int> rounding_policy;
1680     };
1681 
1682     template <>
1683     struct numeric_cast_traits
1684         <
1685             long double
1686           , long
1687         >
1688     {
1689         typedef def_overflow_handler overflow_policy;
1690         typedef UseInternalRangeChecker range_checking_policy;
1691         typedef Trunc<long> rounding_policy;
1692     };
1693 
1694     template <>
1695     struct numeric_cast_traits
1696         <
1697             long double
1698           , unsigned long
1699         >
1700     {
1701         typedef def_overflow_handler overflow_policy;
1702         typedef UseInternalRangeChecker range_checking_policy;
1703         typedef Trunc<unsigned long> rounding_policy;
1704     };
1705 
1706     template <>
1707     struct numeric_cast_traits
1708         <
1709             long double
1710           , float
1711         >
1712     {
1713         typedef def_overflow_handler overflow_policy;
1714         typedef UseInternalRangeChecker range_checking_policy;
1715         typedef Trunc<float> rounding_policy;
1716     };
1717 
1718     template <>
1719     struct numeric_cast_traits
1720         <
1721             long double
1722           , double
1723         >
1724     {
1725         typedef def_overflow_handler overflow_policy;
1726         typedef UseInternalRangeChecker range_checking_policy;
1727         typedef Trunc<double> rounding_policy;
1728     };
1729 
1730     template <>
1731     struct numeric_cast_traits
1732         <
1733             long double
1734           , long double
1735         >
1736     {
1737         typedef def_overflow_handler overflow_policy;
1738         typedef UseInternalRangeChecker range_checking_policy;
1739         typedef Trunc<long double> rounding_policy;
1740     };
1741 }}
1742