File: use_map.cc

package info (click to toggle)
vspline 1.1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,708 kB
  • sloc: cpp: 15,905; ansic: 443; sh: 17; makefile: 2
file content (123 lines) | stat: -rw-r--r-- 4,827 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/************************************************************************/
/*                                                                      */
/*    vspline - a set of generic tools for creation and evaluation      */
/*              of uniform b-splines                                    */
/*                                                                      */
/*            Copyright 2015 - 2023 by Kay F. Jahnke                    */
/*                                                                      */
/*    The git repository for this software is at                        */
/*                                                                      */
/*    https://bitbucket.org/kfj/vspline                                 */
/*                                                                      */
/*    Please direct questions, bug reports, and contributions to        */
/*                                                                      */
/*    kfjahnke+vspline@gmail.com                                        */
/*                                                                      */
/*    Permission is hereby granted, free of charge, to any person       */
/*    obtaining a copy of this software and associated documentation    */
/*    files (the "Software"), to deal in the Software without           */
/*    restriction, including without limitation the rights to use,      */
/*    copy, modify, merge, publish, distribute, sublicense, and/or      */
/*    sell copies of the Software, and to permit persons to whom the    */
/*    Software is furnished to do so, subject to the following          */
/*    conditions:                                                       */
/*                                                                      */
/*    The above copyright notice and this permission notice shall be    */
/*    included in all copies or substantial portions of the             */
/*    Software.                                                         */
/*                                                                      */
/*    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND    */
/*    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES   */
/*    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND          */
/*    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT       */
/*    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,      */
/*    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING      */
/*    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR     */
/*    OTHER DEALINGS IN THE SOFTWARE.                                   */
/*                                                                      */
/************************************************************************/

/*! \file use_map.cc

    \brief test program for code in map.h
    
    The program creates one gate type each of the types provided in map.h
    over the interval [0,1]. Then it queries a value and uses the gates on
    this value in turn, printing out the result.
*/

#include <iostream>
#include <iomanip>
#include <assert.h>
#include <vspline/map.h>

const int VSIZE = vspline::vector_traits < double > :: size ;

template < class gate_type >
void test ( gate_type gx , double x , const char * mode )
{
  std::cout << mode << std::endl ;

  auto tester = vspline::mapper < typename gate_type::in_type > ( gx ) ;
  
  typedef double crd_type ;

  const crd_type crd { x } ;
  crd_type res ;
  
  tester.eval ( crd , res ) ;
  
  std::cout << "single-value operation:" << std::endl ;
  
  std::cout << crd << " -> " << res << std::endl ;

  if ( VSIZE > 1 )
  {
    typedef vspline::vector_traits < crd_type , VSIZE > :: ele_v crd_v ;

    crd_v inv ( crd ) ;
    crd_v resv ;
    
    tester.eval ( inv , resv ) ;
    std::cout << "vectorized operation:" << std::endl
              << inv << " -> " << resv << std::endl ;
  }
}

int main ( int argc , char * argv[] )
{
  double x ;
  
  std::cout << std::fixed << std::showpos << std::showpoint
            << std::setprecision(5);
            
  while ( std::cin.good() )
  {
    std::cout << "enter coordinate to map to [ 0.0 : 1.0 ]" << std::endl ;
    std::cin >> x ;

    if ( std::cin.eof() )
    {
      std::cout << std::endl ;
      break ;
    }

    try
    {
      test ( vspline::reject ( 0.0 , 1.0 ) ,
             x , "REJECT:" ) ;
    }
    catch ( vspline::out_of_bounds )
    {
      std::cout << "exception out_of_bounds" << std::endl ;
    }
    test ( vspline::clamp ( 0.0 , 1.0 , 0.0 , 1.0 ) ,
           x , "CLAMP:" ) ;
           
    test ( vspline::mirror ( 0.0 , 1.0 ) ,
           x , "MIRROR:" ) ;
           
    test ( vspline::periodic ( 0.0 , 1.0 ) ,
           x , "PERIODIC:" ) ;
  }
}