annotate libinterp/corefcn/typecast.cc @ 20939:b17fda023ca6

maint: Use new C++ archetype in more files. Place input validation first in files. Move declaration of retval down in function to be closer to point of usage. Eliminate else clause after if () error. Use "return ovl()" where it makes sense. * find.cc, gammainc.cc, gcd.cc, getgrent.cc, getpwent.cc, givens.cc, graphics.cc, help.cc, hess.cc, hex2num.cc, input.cc, kron.cc, load-path.cc, load-save.cc, lookup.cc, mappers.cc, matrix_type.cc, mgorth.cc, nproc.cc, ordschur.cc, pager.cc, pinv.cc, pr-output.cc, profiler.cc, psi.cc, quad.cc, rcond.cc, regexp.cc, schur.cc, sighandlers.cc, sparse.cc, str2double.cc, strfind.cc, strfns.cc, sub2ind.cc, svd.cc, sylvester.cc, symtab.cc, syscalls.cc, sysdep.cc, time.cc, toplev.cc, tril.cc, tsearch.cc, typecast.cc, urlwrite.cc, utils.cc, variables.cc, __delaunayn__.cc, __eigs__.cc, __glpk__.cc, __magick_read__.cc, __osmesa_print__.cc, __voronoi__.cc, amd.cc, audiodevinfo.cc, audioread.cc, chol.cc, colamd.cc, dmperm.cc, fftw.cc, qr.cc, symbfact.cc, symrcm.cc, ov-bool-mat.cc, ov-cell.cc, ov-class.cc, ov-classdef.cc, ov-fcn-handle.cc, ov-fcn-inline.cc, ov-flt-re-mat.cc, ov-java.cc, ov-null-mat.cc, ov-oncleanup.cc, ov-re-mat.cc, ov-struct.cc, ov-typeinfo.cc, ov-usr-fcn.cc, ov.cc, octave.cc: Use new C++ archetype in more files.
author Rik <rik@octave.org>
date Fri, 18 Dec 2015 15:37:22 -0800
parents 4d3daf7e43f3
children 48b2ad5ee801
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
1 /*
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
2
19697
4197fc428c7d maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents: 19174
diff changeset
3 Copyright (C) 2007-2015 David Bateman
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
4 Copyright (C) 2009 VZLU Prague
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
5
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
6 This file is part of Octave.
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
7
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
8 Octave is free software; you can redistribute it and/or modify it
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6948
diff changeset
10 Free Software Foundation; either version 3 of the License, or (at your
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6948
diff changeset
11 option) any later version.
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
12
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
13 Octave is distributed in the hope that it will be useful, but WITHOUT
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
16 for more details.
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
17
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6948
diff changeset
19 along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6948
diff changeset
20 <http://www.gnu.org/licenses/>.
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
21
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
22 */
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
23
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
24 #ifdef HAVE_CONFIG_H
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
25 #include <config.h>
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
26 #endif
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
27
17396
0b644adf4f31 speak CHAR_BIT in C++-ese
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
28 #include <limits>
15289
27bdffcb41c5 *typecast.cc: Include <climits> for CHAR_BIT.
Júlio Hoffimann <julio.hoffimann@gmail.com>
parents: 15195
diff changeset
29
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
30 #include "mx-base.h"
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
31
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14360
diff changeset
32 #include "defun.h"
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
33 #include "error.h"
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
34 #include "gripes.h"
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
35 #include "oct-obj.h"
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
36 #include "unwind-prot.h"
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
37
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
38 static dim_vector
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
39 get_vec_dims (const dim_vector& old_dims, octave_idx_type n)
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
40 {
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
41 if (old_dims.length () == 2 && old_dims(0) == 1)
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
42 return dim_vector (1, n);
20218
b2100e1659ac maint: Use cuddled parentheses when indexing dimension_vectors.
Rik <rik@octave.org>
parents: 20172
diff changeset
43 else if (old_dims.length () == 2 && old_dims(0) == 0 && old_dims(1) == 0)
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
44 return dim_vector ();
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
45 else
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
46 return dim_vector (n, 1);
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
47 }
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
48
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
49 template <class ArrayType>
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11572
diff changeset
50 static void
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
51 get_data_and_bytesize (const ArrayType& array,
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
52 const void *& data,
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
53 octave_idx_type& byte_size,
10066
2cd940306a06 make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents: 9758
diff changeset
54 dim_vector& old_dims,
2cd940306a06 make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents: 9758
diff changeset
55 unwind_protect& frame)
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
56 {
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
57 // The array given may be a temporary, constructed from a scalar or sparse
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
58 // array. This will ensure the data will be deallocated after we exit.
10066
2cd940306a06 make unwind_protect frames local
Jaroslav Hajek <highegg@gmail.com>
parents: 9758
diff changeset
59 frame.add_delete (new ArrayType (array));
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
60
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
61 data = reinterpret_cast<const void *> (array.data ());
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
62 byte_size = array.byte_size ();
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
63
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
64 old_dims = array.dims ();
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
65 }
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
66
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
67 template <class ArrayType>
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
68 static ArrayType
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
69 reinterpret_copy (const void *data, octave_idx_type byte_size,
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
70 const dim_vector& old_dims)
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
71 {
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
72 typedef typename ArrayType::element_type T;
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
73 octave_idx_type n = byte_size / sizeof (T);
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
74
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
75 if (n * static_cast<int> (sizeof (T)) == byte_size)
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
76 {
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
77 ArrayType retval (get_vec_dims (old_dims, n));
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
78 T *dest = retval.fortran_vec ();
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
79 std::memcpy (dest, data, n * sizeof (T));
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
80
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
81 return retval;
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
82 }
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
83 else
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20800
diff changeset
84 error ("typecast: incorrect number of input values to make output value");
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20800
diff changeset
85
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20800
diff changeset
86 return ArrayType ();
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
87 }
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
88
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
89
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14360
diff changeset
90 DEFUN (typecast, args, ,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
91 "-*- texinfo -*-\n\
20853
1142cf6abc0d 2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents: 20831
diff changeset
92 @deftypefn {} {@var{y} =} typecast (@var{x}, \"@var{class}\")\n\
20172
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
93 Return a new array @var{y} resulting from interpreting the data of @var{x}\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
94 in memory as data of the numeric class @var{class}.\n\
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
95 \n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
96 Both the class of @var{x} and @var{class} must be one of the built-in\n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
97 numeric classes:\n\
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
98 \n\
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
99 @example\n\
9758
09da0bd91412 Periodic grammar check of Octave documentation files to ensure common format
Rik <rdrider0-list@yahoo.com>
parents: 9689
diff changeset
100 @group\n\
14360
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
101 \"logical\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
102 \"char\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
103 \"int8\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
104 \"int16\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
105 \"int32\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
106 \"int64\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
107 \"uint8\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
108 \"uint16\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
109 \"uint32\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
110 \"uint64\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
111 \"double\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
112 \"single\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
113 \"double complex\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
114 \"single complex\"\n\
9758
09da0bd91412 Periodic grammar check of Octave documentation files to ensure common format
Rik <rdrider0-list@yahoo.com>
parents: 9689
diff changeset
115 @end group\n\
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
116 @end example\n\
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
117 \n\
10846
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
118 @noindent\n\
20172
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
119 the last two are only used with @var{class}; they indicate that a\n\
10846
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
120 complex-valued result is requested. Complex arrays are stored in memory as\n\
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
121 consecutive pairs of real numbers. The sizes of integer types are given by\n\
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
122 their bit counts. Both logical and char are typically one byte wide;\n\
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
123 however, this is not guaranteed by C++. If your system is IEEE conformant,\n\
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
124 single and double will be 4 bytes and 8 bytes wide, respectively.\n\
20172
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
125 @qcode{\"logical\"} is not allowed for @var{class}.\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
126 \n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
127 If the input is a row vector, the return value is a row vector, otherwise it\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
128 is a column vector.\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
129 \n\
17281
bc924baa2c4e doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents: 15545
diff changeset
130 If the bit length of @var{x} is not divisible by that of @var{class}, an\n\
bc924baa2c4e doc: Add new @qcode macro for code samples which are quoted.
Rik <rik@octave.org>
parents: 15545
diff changeset
131 error occurs.\n\
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
132 \n\
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
133 An example of the use of typecast on a little-endian machine is\n\
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
134 \n\
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
135 @example\n\
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
136 @group\n\
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
137 @var{x} = uint16 ([1, 65535]);\n\
14360
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
138 typecast (@var{x}, \"uint8\")\n\
15542
69f45f3ab96a Correct big-endian/little-endian reversal in typecast documentation.
Rik <rik@octave.org>
parents: 14138
diff changeset
139 @result{} [ 1, 0, 255, 255]\n\
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
140 @end group\n\
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
141 @end example\n\
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
142 @seealso{cast, bitpack, bitunpack, swapbytes}\n\
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
143 @end deftypefn")
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
144 {
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
145 if (args.length () != 2)
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
146 print_usage ();
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
147
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20921
diff changeset
148 octave_value retval;
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20921
diff changeset
149
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
150 unwind_protect frame;
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20921
diff changeset
151
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
152 const void *data = 0;
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
153 octave_idx_type byte_size = 0;
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
154 dim_vector old_dims;
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
155
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
156 octave_value array = args(0);
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
157
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
158 if (array.is_bool_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
159 get_data_and_bytesize (array.bool_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
160 old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
161 else if (array.is_string ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
162 get_data_and_bytesize (array.char_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
163 old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
164 else if (array.is_integer_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
165 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
166 if (array.is_int8_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
167 get_data_and_bytesize (array.int8_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
168 old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
169 else if (array.is_int16_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
170 get_data_and_bytesize (array.int16_array_value (), data, byte_size,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
171 old_dims, frame);
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
172 else if (array.is_int32_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
173 get_data_and_bytesize (array.int32_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
174 old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
175 else if (array.is_int64_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
176 get_data_and_bytesize (array.int64_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
177 old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
178 else if (array.is_uint8_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
179 get_data_and_bytesize (array.uint8_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
180 old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
181 else if (array.is_uint16_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
182 get_data_and_bytesize (array.uint16_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
183 old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
184 else if (array.is_uint32_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
185 get_data_and_bytesize (array.uint32_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
186 old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
187 else if (array.is_uint64_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
188 get_data_and_bytesize (array.uint64_array_value (), data, byte_size,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
189 old_dims, frame);
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
190 else
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
191 assert (0);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
192 }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
193 else if (array.is_complex_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
194 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
195 if (array.is_single_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
196 get_data_and_bytesize (array.float_complex_array_value (), data,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
197 byte_size, old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
198 else
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
199 get_data_and_bytesize (array.complex_array_value (), data,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
200 byte_size, old_dims, frame);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
201 }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
202 else if (array.is_real_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
203 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
204 if (array.is_single_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
205 get_data_and_bytesize (array.float_array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
206 old_dims, frame);
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
207 else
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
208 get_data_and_bytesize (array.array_value (), data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
209 old_dims, frame); }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
210 else
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
211 error ("typecast: invalid input class: %s",
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
212 array.class_name ().c_str ());
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
213
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
214 std::string numclass = args(1).string_value ();
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
215
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
216 if (numclass.size () == 0)
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
217 ;
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
218 else if (numclass == "char")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
219 retval = octave_value (reinterpret_copy<charNDArray>
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
220 (data, byte_size, old_dims), array.is_dq_string () ? '"'
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
221 : '\'');
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
222 else if (numclass[0] == 'i')
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
223 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
224 if (numclass == "int8")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
225 retval = reinterpret_copy<int8NDArray> (data, byte_size, old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
226 else if (numclass == "int16")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
227 retval = reinterpret_copy<int16NDArray> (data, byte_size, old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
228 else if (numclass == "int32")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
229 retval = reinterpret_copy<int32NDArray> (data, byte_size, old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
230 else if (numclass == "int64")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
231 retval = reinterpret_copy<int64NDArray> (data, byte_size, old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
232 }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
233 else if (numclass[0] == 'u')
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
234 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
235 if (numclass == "uint8")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
236 retval = reinterpret_copy<uint8NDArray> (data, byte_size, old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
237 else if (numclass == "uint16")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
238 retval = reinterpret_copy<uint16NDArray> (data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
239 old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
240 else if (numclass == "uint32")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
241 retval = reinterpret_copy<uint32NDArray> (data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
242 old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
243 else if (numclass == "uint64")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
244 retval = reinterpret_copy<uint64NDArray> (data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
245 old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
246 }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
247 else if (numclass == "single")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
248 retval = reinterpret_copy<FloatNDArray> (data, byte_size, old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
249 else if (numclass == "double")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
250 retval = reinterpret_copy<NDArray> (data, byte_size, old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
251 else if (numclass == "single complex")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
252 retval = reinterpret_copy<FloatComplexNDArray> (data, byte_size,
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
253 old_dims);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
254 else if (numclass == "double complex")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
255 retval = reinterpret_copy<ComplexNDArray> (data, byte_size, old_dims);
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
256
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
257 if (retval.is_undefined ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
258 error ("typecast: cannot convert to %s class", numclass.c_str ());
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
259
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
260 return retval;
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
261 }
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
262
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
263 template <class ArrayType>
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
264 ArrayType
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
265 do_bitpack (const boolNDArray& bitp)
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
266 {
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
267 typedef typename ArrayType::element_type T;
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
268 octave_idx_type n
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
269 = bitp.numel () / (sizeof (T) * std::numeric_limits<unsigned char>::digits);
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
270
17396
0b644adf4f31 speak CHAR_BIT in C++-ese
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
271 if (n * static_cast<int> (sizeof (T)) * std::numeric_limits<unsigned char>::digits == bitp.numel ())
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
272 {
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
273
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
274 ArrayType retval (get_vec_dims (bitp.dims (), n));
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
275
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
276 const bool *bits = bitp.fortran_vec ();
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
277 char *packed = reinterpret_cast<char *> (retval.fortran_vec ());
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
278
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
279 octave_idx_type m = n * sizeof (T);
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
280
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
281 for (octave_idx_type i = 0; i < m; i++)
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
282 {
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
283 char c = bits[0];
17396
0b644adf4f31 speak CHAR_BIT in C++-ese
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
284 for (int j = 1; j < std::numeric_limits<unsigned char>::digits; j++)
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
285 c |= bits[j] << j;
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
286
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
287 packed[i] = c;
17396
0b644adf4f31 speak CHAR_BIT in C++-ese
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
288 bits += std::numeric_limits<unsigned char>::digits;
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
289 }
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
290
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
291 return retval;
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
292 }
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
293 else
20831
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20800
diff changeset
294 error ("bitpack: incorrect number of bits to make up output value");
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20800
diff changeset
295
35241c4b696c eliminate return statements after calls to error
John W. Eaton <jwe@octave.org>
parents: 20800
diff changeset
296 return ArrayType ();
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
297 }
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
298
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14360
diff changeset
299 DEFUN (bitpack, args, ,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
300 "-*- texinfo -*-\n\
20853
1142cf6abc0d 2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents: 20831
diff changeset
301 @deftypefn {} {@var{y} =} bitpack (@var{x}, @var{class})\n\
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
302 Return a new array @var{y} resulting from interpreting the logical array\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
303 @var{x} as raw bit patterns for data of the numeric class @var{class}.\n\
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
304 \n\
10846
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
305 @var{class} must be one of the built-in numeric classes:\n\
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
306 \n\
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
307 @example\n\
9758
09da0bd91412 Periodic grammar check of Octave documentation files to ensure common format
Rik <rdrider0-list@yahoo.com>
parents: 9689
diff changeset
308 @group\n\
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
309 \"double\"\n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
310 \"single\"\n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
311 \"double complex\"\n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
312 \"single complex\"\n\
14360
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
313 \"char\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
314 \"int8\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
315 \"int16\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
316 \"int32\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
317 \"int64\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
318 \"uint8\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
319 \"uint16\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
320 \"uint32\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
321 \"uint64\"\n\
9758
09da0bd91412 Periodic grammar check of Octave documentation files to ensure common format
Rik <rdrider0-list@yahoo.com>
parents: 9689
diff changeset
322 @end group\n\
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
323 @end example\n\
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
324 \n\
10840
89f4d7e294cc Grammarcheck .cc files
Rik <octave@nomad.inbox5.com>
parents: 10807
diff changeset
325 The number of elements of @var{x} should be divisible by the bit length of\n\
10846
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
326 @var{class}. If it is not, excess bits are discarded. Bits come in\n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
327 increasing order of significance, i.e., @code{x(1)} is bit 0, @code{x(2)} is\n\
20172
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
328 bit 1, etc.\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
329 \n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
330 The result is a row vector if @var{x} is a row vector, otherwise it is a\n\
4f45eaf83908 doc: Update more docstrings to have one sentence summary as first line.
Rik <rik@octave.org>
parents: 19697
diff changeset
331 column vector.\n\
11572
7d6d8c1e471f Grammarcheck Texinfo for files in src directory.
Rik <octave@nomad.inbox5.com>
parents: 11553
diff changeset
332 @seealso{bitunpack, typecast}\n\
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
333 @end deftypefn")
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
334 {
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
335 if (args.length () != 2)
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
336 print_usage ();
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
337
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
338 if (! args(0).is_bool_type ())
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
339 error ("bitpack: X must be a logical array");
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
340
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20921
diff changeset
341 octave_value retval;
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20921
diff changeset
342
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
343 boolNDArray bitp = args(0).bool_array_value ();
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
344
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
345 std::string numclass = args(1).string_value ();
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
346
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
347 if (numclass.size () == 0)
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
348 ;
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
349 else if (numclass == "char")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
350 retval = octave_value (do_bitpack<charNDArray> (bitp), '\'');
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
351 else if (numclass[0] == 'i')
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
352 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
353 if (numclass == "int8")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
354 retval = do_bitpack<int8NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
355 else if (numclass == "int16")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
356 retval = do_bitpack<int16NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
357 else if (numclass == "int32")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
358 retval = do_bitpack<int32NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
359 else if (numclass == "int64")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
360 retval = do_bitpack<int64NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
361 }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
362 else if (numclass[0] == 'u')
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
363 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
364 if (numclass == "uint8")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
365 retval = do_bitpack<uint8NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
366 else if (numclass == "uint16")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
367 retval = do_bitpack<uint16NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
368 else if (numclass == "uint32")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
369 retval = do_bitpack<uint32NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
370 else if (numclass == "uint64")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
371 retval = do_bitpack<uint64NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
372 }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
373 else if (numclass == "single")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
374 retval = do_bitpack<FloatNDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
375 else if (numclass == "double")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
376 retval = do_bitpack<NDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
377 else if (numclass == "single complex")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
378 retval = do_bitpack<FloatComplexNDArray> (bitp);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
379 else if (numclass == "double complex")
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
380 retval = do_bitpack<ComplexNDArray> (bitp);
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
381
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
382 if (retval.is_undefined ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
383 error ("bitpack: cannot pack to %s class", numclass.c_str ());
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
384
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
385 return retval;
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
386 }
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
387
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
388 template <class ArrayType>
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
389 boolNDArray
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
390 do_bitunpack (const ArrayType& array)
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
391 {
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
392 typedef typename ArrayType::element_type T;
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
393 octave_idx_type n = array.numel () * sizeof (T)
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
394 * std::numeric_limits<unsigned char>::digits;
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
395
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
396 boolNDArray retval (get_vec_dims (array.dims (), n));
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
397
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
398 const char *packed = reinterpret_cast<const char *> (array.fortran_vec ());
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
399 bool *bits = retval.fortran_vec ();
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
400
17396
0b644adf4f31 speak CHAR_BIT in C++-ese
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
401 octave_idx_type m = n / std::numeric_limits<unsigned char>::digits;
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
402
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
403 for (octave_idx_type i = 0; i < m; i++)
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
404 {
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
405 char c = packed[i];
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
406 bits[0] = c & 1;
17396
0b644adf4f31 speak CHAR_BIT in C++-ese
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
407 for (int j = 1; j < std::numeric_limits<unsigned char>::digits; j++)
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
408 bits[j] = (c >>= 1) & 1;
17396
0b644adf4f31 speak CHAR_BIT in C++-ese
John W. Eaton <jwe@octave.org>
parents: 17281
diff changeset
409 bits += std::numeric_limits<unsigned char>::digits;
6869
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
410 }
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
411
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
412 return retval;
f9c893831e68 [project @ 2007-09-06 16:38:44 by dbateman]
dbateman
parents:
diff changeset
413 }
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
414
15039
e753177cde93 maint: Move non-dynamically linked functions from DLD-FUNCTIONS/ to corefcn/ directory
Rik <rik@octave.org>
parents: 14360
diff changeset
415 DEFUN (bitunpack, args, ,
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
416 "-*- texinfo -*-\n\
20853
1142cf6abc0d 2015 Code Sprint: remove class of function from docstring for all C++ files.
Rik <rik@octave.org>
parents: 20831
diff changeset
417 @deftypefn {} {@var{y} =} bitunpack (@var{x})\n\
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
418 Return a logical array @var{y} corresponding to the raw bit patterns of\n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
419 @var{x}.\n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
420 \n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
421 @var{x} must belong to one of the built-in numeric classes:\n\
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
422 \n\
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
423 @example\n\
9758
09da0bd91412 Periodic grammar check of Octave documentation files to ensure common format
Rik <rdrider0-list@yahoo.com>
parents: 9689
diff changeset
424 @group\n\
19174
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
425 \"double\"\n\
6f3e922c5197 doc: Improve docstrings for typecast, bitpack, bitunpack.
Rik <rik@octave.org>
parents: 17787
diff changeset
426 \"single\"\n\
14360
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
427 \"char\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
428 \"int8\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
429 \"int16\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
430 \"int32\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
431 \"int64\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
432 \"uint8\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
433 \"uint16\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
434 \"uint32\"\n\
97883071e8e4 doc: Correct off-by-1 spacings in all .cc docstrings
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
435 \"uint64\"\n\
9758
09da0bd91412 Periodic grammar check of Octave documentation files to ensure common format
Rik <rdrider0-list@yahoo.com>
parents: 9689
diff changeset
436 @end group\n\
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
437 @end example\n\
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
438 \n\
11553
01f703952eff Improve docstrings for functions in DLD-FUNCTIONS directory.
Rik <octave@nomad.inbox5.com>
parents: 11523
diff changeset
439 The result is a row vector if @var{x} is a row vector; otherwise, it is a\n\
10846
a4f482e66b65 Grammarcheck more of the documentation.
Rik <octave@nomad.inbox5.com>
parents: 10840
diff changeset
440 column vector.\n\
11572
7d6d8c1e471f Grammarcheck Texinfo for files in src directory.
Rik <octave@nomad.inbox5.com>
parents: 11553
diff changeset
441 @seealso{bitpack, typecast}\n\
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
442 @end deftypefn")
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
443 {
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
444 if (args.length () != 1)
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
445 print_usage ();
20921
4d3daf7e43f3 eliminate trailing whitespace in source files
John W. Eaton <jwe@octave.org>
parents: 20853
diff changeset
446
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
447 if (! (args(0).is_numeric_type () || args(0).is_string ()))
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
448 error ("bitunpack: argument must be a number or a string");
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
449
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20921
diff changeset
450 octave_value retval;
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20921
diff changeset
451
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
452 octave_value array = args(0);
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
453
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
454 if (array.is_string ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
455 retval = do_bitunpack (array.char_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
456 else if (array.is_integer_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
457 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
458 if (array.is_int8_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
459 retval = do_bitunpack (array.int8_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
460 else if (array.is_int16_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
461 retval = do_bitunpack (array.int16_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
462 else if (array.is_int32_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
463 retval = do_bitunpack (array.int32_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
464 else if (array.is_int64_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
465 retval = do_bitunpack (array.int64_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
466 else if (array.is_uint8_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
467 retval = do_bitunpack (array.uint8_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
468 else if (array.is_uint16_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
469 retval = do_bitunpack (array.uint16_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
470 else if (array.is_uint32_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
471 retval = do_bitunpack (array.uint32_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
472 else if (array.is_uint64_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
473 retval = do_bitunpack (array.uint64_array_value ());
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
474 else
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
475 assert (0);
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
476 }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
477 else if (array.is_complex_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
478 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
479 if (array.is_single_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
480 retval = do_bitunpack (array.float_complex_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
481 else
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
482 retval = do_bitunpack (array.complex_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
483 }
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
484 else if (array.is_real_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
485 {
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
486 if (array.is_single_type ())
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
487 retval = do_bitunpack (array.float_array_value ());
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
488 else
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
489 retval = do_bitunpack (array.array_value ());
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
490 }
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
491 else
20800
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
492 error ("bitunpack: invalid input class: %s",
fb128aafc322 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20555
diff changeset
493 array.class_name ().c_str ());
9671
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
494
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
495 return retval;
e4b383a0effa merge reinterpret.cc into typecast.cc
Jaroslav Hajek <highegg@gmail.com>
parents: 9036
diff changeset
496 }