/*
 * Copyright (c) 2019 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * NOTE: Only include this file from external components that require
 * a loose coupling to the stats component.
 */

#ifndef included_stat_weak_inlines_h
#define included_stat_weak_inlines_h
void *vlib_stats_push_heap (void *) __attribute__ ((weak));
void *
vlib_stats_push_heap (void *unused)
{
  return 0;
};

void vlib_stats_pop_heap (void *, void *, u32, int) __attribute__ ((weak));
void
vlib_stats_pop_heap (void *notused, void *notused2, u32 i, int type)
{
};
void vlib_stats_register_error_index (void *, u8 *, u64 *, u64)
  __attribute__ ((weak));
void
vlib_stats_register_error_index (void * notused, u8 * notused2, u64 * notused3, u64 notused4)
{
};

void vlib_stats_pop_heap2 (void *, u32, void *, int) __attribute__ ((weak));
void
vlib_stats_pop_heap2 (void *notused, u32 notused2, void *notused3,
		      int notused4)
{
};

void vlib_stat_segment_lock (void) __attribute__ ((weak));
void
vlib_stat_segment_lock (void)
{
}

void vlib_stat_segment_unlock (void) __attribute__ ((weak));
void
vlib_stat_segment_unlock (void)
{
}
void vlib_stats_delete_cm (void *) __attribute__ ((weak));
void
vlib_stats_delete_cm (void *notused)
{
}

#endif
