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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
crate::ix!();

#[inline] pub fn blob_is_int_8tensor_cputype(blob: &Blob) -> bool {
    
    todo!();
    /*
        return blob.meta().Match<int8::Int8TensorCPU>();
    */
}

#[inline] pub fn blob_is_tensor_type(
    blob: &Blob, 
    device_type: DeviceType) -> bool 
{
    todo!();

    /*
    let is_match: bool = blob.meta().r#match::<Tensor>();

    if !is_match {
        return false;
    }

    let tensor: *const Tensor = blob.get::<Tensor>();

    tensor != std::ptr::null() && (*tensor).get_device_type() == device_type
    */
}

#[inline] pub fn blob_set_tensor(
    blob: *mut Blob,
    tensor: Tensor) -> *mut Tensor 
{
    todo!();
    /*
        return blob->Reset<Tensor>(new Tensor(std::move(tensor)));
    */
}

#[inline] pub fn get_sized_tensor_with_options(
    previous_tensor: Tensor,
    dims:            &[i32],
    options:         TensorOptions) -> Tensor {

    todo!();
    /*
      Tensor tensor = std::move(previous_tensor);
      if (!tensor.defined()) {
        return caffe2::empty(dims, options);
      }
      if (tensor.GetDevice() == options.device() ||
          (!tensor.GetDevice().has_index() &&
           tensor.GetDeviceType() == options.device().type())) {
        if (tensor.sizes() != dims) {
          // Resize when the dims doesn't match
          tensor.Resize(dims);
        }
        if (tensor.dtype() == options.dtype()) {
          tensor.raw_mutable_data();
        } else {
          // create a new Tensor when the data_type doesn't match
          return caffe2::empty(dims, options);
        }
        return tensor;
      }
      return caffe2::empty(dims, options);
    */
}

/**
  | need to keep both functions that returns
  | Tensor* and the one returns Tensor for
  | clangr codemod
  |
  */
#[inline] pub fn blob_get_mutable_tensor_with_options(
    blob:    *mut Blob,
    dims:    &[i32],
    options: TensorOptions) -> *mut Tensor {
    
    todo!();
    /*
        if (blob->IsType<Tensor>()) {
        Tensor* tensor = blob->GetMutable<Tensor>();
        if (*tensor) {
          // We only compare device_type if the index is not set since there are Tensors
          // TODO: remove the extra check when all the Tensors are properly initialized
          if (tensor->GetDevice() == options.device() || (!tensor->GetDevice().has_index() && tensor->GetDeviceType() == options.device().type())) {
            if (tensor->sizes() != dims) {
              // Resize when the dims doesn't match
              tensor->Resize(dims);
            }
            if (tensor->dtype() == options.dtype()) {
              tensor->raw_mutable_data();
            } else {
              tensor->raw_mutable_data(options.dtype());
            }
            return tensor;
          }
          // create a new Tensor when device doesn't match
        }
      }

      VLOG(1) << "Create new mutable object " << TypeMeta::TypeName<Tensor>()
              << " dims: " << dims;
      // << " options: " << options; (operator<< for Options is in at:: now)
      return BlobSetTensor(blob, caffe2::empty(dims, options));
    */
}

#[inline] pub fn xBlob_get_mutable_tensor(
    blob:    *mut Blob,
    dims:    &[i32],
    options: TensorOptions) -> Tensor {

    todo!();
    /*
        return BlobGetMutableTensor(blob, dims, options)->UnsafeSharedInstance();
    */
}

#[inline] pub fn blob_get_mutable_tensor(
    blob:        *mut Blob,
    device_type: DeviceType) -> *mut Tensor {

    todo!();
    /*
      if (blob->IsType<Tensor>()) {
        Tensor* tensor = blob->GetMutable<Tensor>();
        if (*tensor && tensor->GetDeviceType() == device_type) {
          return tensor;
        }
      }

      // if we're here, then either Blob didn't hold a Tensor
      // or that Tensor had the wrong DeviceType.
      VLOG(1) << "Create new mutable object " << TypeMeta::TypeName<Tensor>()
              << " DeviceType:" << device_type;

      return BlobSetTensor(blob, Tensor(device_type));
    */
}

#[inline] pub fn blob_get_tensor(blob: &Blob,
    device_type: DeviceType) -> &Tensor {

    todo!();
    /*
      if (blob.IsType<Tensor>()) {
        const auto& tensor = blob.Get<Tensor>();
        if (tensor.GetDeviceType() == device_type) {
          return tensor;
        }
      }
      CAFFE_THROW("Blob didn't contain a Tensor or the device_type doesn't match");
    */
}

#[inline] pub fn blob_get_tensor_or_undefined(blob: &Blob) -> Tensor {
    
    todo!();
    /*
      if (blob.IsType<Tensor>()) {
        return blob.Get<Tensor>().UnsafeSharedInstance();
      } else {
        return Tensor();
      }
    */
}