generics_test.rs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #![allow(dead_code)]
  2. use anchor_lang::prelude::borsh::maybestd::io::Write;
  3. use anchor_lang::prelude::*;
  4. use borsh::{BorshDeserialize, BorshSerialize};
  5. use solana_program::pubkey::Pubkey;
  6. // Needed to declare accounts.
  7. declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
  8. #[derive(Accounts)]
  9. pub struct GenericsTest<'info, T, U, const N: usize>
  10. where
  11. T: AccountSerialize + AccountDeserialize + Owner + Clone,
  12. U: BorshSerialize + BorshDeserialize + Default + Clone,
  13. {
  14. pub non_generic: AccountInfo<'info>,
  15. pub generic: Account<'info, T>,
  16. pub const_generic: AccountLoader<'info, FooAccount<N>>,
  17. pub const_generic_loader: AccountLoader<'info, FooAccount<N>>,
  18. pub associated: Account<'info, Associated<U>>,
  19. }
  20. #[account(zero_copy(unsafe))]
  21. pub struct FooAccount<const N: usize> {
  22. pub data: WrappedU8Array<N>,
  23. }
  24. #[account]
  25. #[derive(Default)]
  26. pub struct Associated<T>
  27. where
  28. T: BorshDeserialize + BorshSerialize + Default,
  29. {
  30. pub data: T,
  31. }
  32. #[derive(Copy, Clone)]
  33. pub struct WrappedU8Array<const N: usize>(u8);
  34. impl<const N: usize> BorshSerialize for WrappedU8Array<N> {
  35. fn serialize<W: Write>(&self, _writer: &mut W) -> borsh::maybestd::io::Result<()> {
  36. todo!()
  37. }
  38. }
  39. impl<const N: usize> BorshDeserialize for WrappedU8Array<N> {
  40. fn deserialize(_buf: &mut &[u8]) -> borsh::maybestd::io::Result<Self> {
  41. todo!()
  42. }
  43. fn deserialize_reader<R: std::io::Read>(_reader: &mut R) -> std::io::Result<Self> {
  44. todo!()
  45. }
  46. }
  47. impl<const N: usize> Owner for WrappedU8Array<N> {
  48. fn owner() -> Pubkey {
  49. crate::ID
  50. }
  51. }