generics_test.rs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  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)]
  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. }
  44. impl<const N: usize> Owner for WrappedU8Array<N> {
  45. fn owner() -> Pubkey {
  46. crate::ID
  47. }
  48. }